【发布时间】:2013-12-21 05:59:28
【问题描述】:
我想在我编写的非 Web 应用程序 Java 程序中使用 c3p0 进行连接池。我使用传统的单例连接,对它的性能不满意,所以我决定使用连接池。我看了一下 c3p0 网站,这是他们讲述的使用 c3p0 的内容:
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "org.postgresql.Driver" ); //loads the jdbc driver
cpds.setJdbcUrl( "jdbc:postgresql://localhost/testdb" );
cpds.setUser("swaldman");
cpds.setPassword("test-password");
// the settings below are optional -- c3p0 can work with defaults
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);
// The DataSource cpds is now a fully configured and usable pooled DataSource
我想知道如何将它用于 ms sql windows 身份验证连接,但我不知道怎么做?另外如何通过该连接设置我的查询?似乎使用连接池与传统的数据库连接完全不同,我对此并不陌生。 这是我的想法:
public class DatabaseManager {
private static DataSource dataSource;
private static final String DRIVER_NAME;
private static final String URL;
private static final String UNAME;
private static final String PWD;
private static final String dbName;
static {
dbName="SNfinal";
DRIVER_NAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
URL = "jdbc:sqlserver://localhost:1433;" +
"databaseName="+dbName+";integratedSecurity=true";
UNAME = "";
PWD = "";
dataSource = setupDataSource();
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
private static DataSource setupDataSource() {
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass(DRIVER_NAME);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
cpds.setJdbcUrl(URL);
cpds.setUser(UNAME);
cpds.setPassword(PWD);
cpds.setMinPoolSize(1000);
cpds.setAcquireIncrement(1000);
cpds.setMaxPoolSize(20000);
return cpds;
}
public static ResultSet executeQuery(String SQL, String dbName)
{
ResultSet rset = null ;
try {
Connection con=DatabaseManager.getConnection();
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rset = st.executeQuery(SQL);
}
catch (SQLException e) {
System.out.println(e.getMessage());
System.exit(0);
}
return rset;
}
public static void executeUpdate(String SQL, String dbName)
{
try {
Connection con=DatabaseManager.getConnection();
Statement st = con.createStatement();
st.executeUpdate(SQL);
}
catch (SQLException e) {
System.out.println(e.getMessage());
System.exit(0);
}
}
}
当我使用这个类时,它可以很好地处理大约 2000 个查询,之后它停止工作,出现一些与资源分配相关的异常!
【问题讨论】:
-
@NimChimpsky 虽然我很欣赏HikariCP 的插件,但即使是 HikariCP 也无法让您免于资源泄漏。 :-) 请参阅下面史蒂夫的回答。
标签: java connection-pooling c3p0