【问题标题】:jdbc connection with java, singleton connection object or spring jdbc connection?java的jdbc连接,单例连接对象还是spring jdbc连接?
【发布时间】:2011-06-07 13:13:17
【问题描述】:

我正在用 java 操作一个 postgresql 数据库。请帮我选择一个开发实践。

我必须:

  • 创建一个 jdbc 单例对象?
  • 为每个请求创建一个新连接?
  • 还是使用jdbc api for spring framework?

最佳做法是什么?

【问题讨论】:

  • 这个太笼统了,你目前在用什么,你想达到什么目的?

标签: java sql spring postgresql jdbc


【解决方案1】:

模糊问题的模糊答案:

宁可管理您的 JDBC 连接。如果您打开了太多连接,则必须维护它们并确保它们已关闭以供其他连接访问数据库(您可能会出现“打开的文件过多”的异常)。连接池维护您的连接。每个请求有 1 个连接,完成后将其返回到池中。

我会这样做:

  • Connection Pool 中维护我的 JDBC 连接(感谢 Jigar Joshi)。
  • 从连接池请求连接并在我的DAO 中使用它(DAO 是我的对象对 DB 的 CRUD)。
  • 连接完成后,将连接返回到连接池。

如果您使用的是 Spring,请使用 Spring JDBC Template

【讨论】:

    【解决方案2】:

    我在哪里可以找到有关如何进行连接的良好说明或教程 将 JDBC 汇集到我客户端上的 Postgres 数据库?

    http://www.mchange.com/projects/c3p0/index.html

    c3p0 被设计成易于使用。直接放jar文件 [lib/c3p0-0.9.0.jar] 在你应用程序的有效 CLASSPATH 中,并制作一个 像这样的数据源:

    import com.mchange.v2.c3p0.*;
    
    ...
    
    ComboPooledDataSource cpds = new ComboPooledDataSource();
    cpds.setDriverClass( "org.postgresql.Driver" ); //loads the jdbc driver            
    cpds.setJdbcUrl( "jdbc:postgresql://localhost/testdb" );
    cpds.setUser("dbuser");                                  
    cpds.setPassword("dbpassword");    
    

    【可选】如果要开启PreparedStatement池化,还必须设置 maxStatements 和/或 maxStatementsPerConnection(均默认为 0):

    cpds.setMaxStatements( 180 ); 
    

    对你的数据源做任何你想做的事,这将得到一个支持 使用默认参数设置的连接池。您可以绑定数据源 到 JNDI 名称服务,或根据您的喜好直接使用它。 完成后,您可以像这样清理已创建的 DataSource:

    DataSources.destroy( cpds );
    

    就是这样!剩下的就是细节。

    【讨论】:

      【解决方案3】:

      保持单个连接甚至更好地使用Connection-pooling

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 2014-09-13
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多