java—singleton不适合获取jdbc连接吗?连接池有什么好的实现吗?

x33g5p2x  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(323)

我使用单例模式为我的独立应用程序获取jdbc连接。代码如下。

  1. public static synchronized MysqlConnect getDbCon() {
  2. if ( db == null ) {
  3. db = new MysqlConnect();
  4. }
  5. return db;
  6. }

但我在很多讨论中看到了单身汉不利于获得联系。是真的吗?建议使用连接池。有谁能给我一个好的连接池实现来代替上面的代码吗?

vm0i2vca

vm0i2vca1#

下面是一个简单的、基于单例的连接池实现。此连接池支持使用drivermanager接口或通过数据源(jndi)获取连接。
我在我的一些项目中使用这个连接池(尽管实际的实现稍微复杂一些)

  1. public class ConnectionPool{
  2. private String jdbcDriver;
  3. private String jdbcURL;
  4. private String user;
  5. private String password;
  6. private int connectionCount=10;
  7. private List<Connection> connections;
  8. private static boolean loadFromDataSource;
  9. private static DataSource dataSource;
  10. private static ConnectionPool connPool;
  11. private ConnectionPool() throws EasyORMException{}
  12. private void setConnection(String jdbcDriver, String jdbcURL, String user, String password,String dbDataSource) throws EasyORMException{
  13. this.jdbcDriver = jdbcDriver;
  14. this.jdbcURL=jdbcURL;
  15. this.user=user;
  16. this.password=password;
  17. connections= new ArrayList<Connection>();
  18. connections.add((ConnectionPool.loadFromDataSource) ? getConnectionFromDataSource() : getConnection());
  19. }
  20. static ConnectionPool getInstance(){
  21. return connPool;
  22. }
  23. private static ConnectionPool getInstanceFromJndi(String propertyFile,boolean loadFromJndi) throws EasyORMException{
  24. ConnectionProp cp=readPropFromFile(propertyFile);
  25. if(loadFromJndi){
  26. dataSource=createDatasource(cp.getDataSource());
  27. loadFromDataSource=true;
  28. }
  29. return ConnectionPool.createConnectionPool(cp.getJdbcDriver(),cp.getDbURL(), cp.getUsername(), cp.getPassword(),cp.getDataSource())
  30. }
  31. public static ConnectionPool getInstance(String propertyFile,boolean loadFromJndi) throws EasyORMException{
  32. return ConnectionPool.getInstanceFromJndi(propertyFile, loadFromJndi, false);
  33. }
  34. public static ConnectionPool getInstance(ConnectionProp cp) throws EasyORMException{
  35. return ConnectionPool.createConnectionPool(cp.getJdbcDriver(),cp.getDbURL(), cp.getUsername(), cp.getPassword(),cp.getDataSource());
  36. }
  37. public static ConnectionPool getInstance(String jndiName) throws EasyORMException{
  38. dataSource=createDatasource(jndiName);
  39. loadFromDataSource=true;
  40. return ConnectionPool.createConnectionPool(null,null, null, null,jndiName);
  41. }
  42. public static ConnectionPool getInstance(String jdbcDriver, String jdbcURL, String user, String password) throws EasyORMException{
  43. return ConnectionPool.createConnectionPool(jdbcDriver,jdbcURL, user, password,null);
  44. }
  45. private static ConnectionPool createConnectionPool(String jdbcDriver, String jdbcURL, String user, String password,String dbDataSource) throws EasyORMException{
  46. if(connPool==null) {
  47. connPool = new ConnectionPool();
  48. connPool.setConnection(jdbcDriver, jdbcURL, user, password, dbDataSource);
  49. }
  50. return connPool;
  51. }
  52. synchronized Connection getAvailableConnection() throws EasyORMException {
  53. Connection conn=null;
  54. int connSize = connections.size();
  55. if(connSize>0){
  56. conn=connections.remove(connSize-1);
  57. }else{
  58. if(connSize<connectionCount){
  59. for(int i=0;i<initialConnCount;i++)
  60. conn=(ConnectionPool.loadFromDataSource)?getConnectionFromDataSource() :getConnection();
  61. }else{
  62. throw new EasyORMException(EasyORMException.CONNECTION_NUM_EXCEEDED);
  63. }
  64. }
  65. return conn;
  66. }
  67. synchronized void returnConnection(Connection conn){
  68. connections.add(conn);
  69. }
  70. private Connection getConnection() throws EasyORMException {
  71. Connection conn=null;
  72. try {
  73. Class.forName(jdbcDriver);
  74. conn = DriverManager.getConnection(jdbcURL, user, password);
  75. } catch (ClassNotFoundException e) {
  76. throw new EasyORMException(e);
  77. } catch (SQLException e) {
  78. throw new EasyORMException(e);
  79. }
  80. return conn;
  81. }
  82. private Connection getConnectionFromDataSource() throws EasyORMException {
  83. try{
  84. return dataSource.getConnection();
  85. }catch(SQLException e){
  86. throw new EasyORMException(e);
  87. }
  88. }
  89. public void setNumberOfConnections(int count){
  90. this.connectionCount=count;
  91. }
  92. public int getNumberOfConnections(){
  93. return connectionCount;
  94. }
  95. private static DataSource createDatasource(String jndiDb)throws EasyORMException{
  96. InitialContext initCtx=null;
  97. try {
  98. initCtx = new InitialContext();
  99. return (DataSource)initCtx.lookup("java:comp/env/"+jndiDb);
  100. } catch (NamingException e) {
  101. throw new EasyORMException(e);
  102. }finally{
  103. if(initCtx!=null){
  104. try {
  105. initCtx.close();
  106. } catch (NamingException e) {
  107. throw new EasyORMException(e);
  108. }
  109. }
  110. }
  111. }
  112. }

有些方法没有公共访问权限(因为它们是作为库的一部分编写的),但是如果需要,可以将它们更改为public。

展开查看全部

相关问题