java的jdbc连接,单例连接对象还是spring jdbc连接?

Posted

技术标签:

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

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

我必须:

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

最佳做法是什么?

【问题讨论】:

这个太笼统了,你目前在用什么,你想达到什么目的? 【参考方案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

【讨论】:

见this

以上是关于java的jdbc连接,单例连接对象还是spring jdbc连接?的主要内容,如果未能解决你的问题,请参考以下文章

单例模式的几种实现方式

Java之JDBC连接池

Java数据库连接的连接API

java使用jdbc连接数据库步骤

Java通过JDBC连接数据库详解

Java数据库的连接JDBC