【发布时间】:2012-02-16 10:55:28
【问题描述】:
我有一个在 Blackboard 学习软件中运行的 Java Web 应用程序,它使用 Tomcat 5.5。 该应用程序连接到外部数据库。
我无权在 Blackboard 服务器上声明数据源,因此我尝试将所有内容打包到 Web 应用程序中。尽管在使用后仔细关闭了所有结果集、语句和连接,但我的基于公共资源的池方法连接不足时遇到了问题。 我现在正在切换到 C3P0 池方法,但我不确定我的一般方法是否正确。
我正在使用单例类来创建数据源,目的是最大限度地减少实现连接池的数据源的创建和销毁。以下课程应该清楚地说明这一点。这是一种合理的方法,还是可能导致我之前的连接用尽问题?
谢谢。
编辑。更新了问题以阐明单例方法的目的。我试图避免在每次需要数据库连接时创建数据源。这似乎抵消了连接池的好处。
数据源类:
import java.beans.PropertyVetoException;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import com.mchange.v2.c3p0.*;
public class MyDataSource {
private static MyDataSource mds = new MyDataSource();
public static DataSource ds;
private MyDataSource() {
try {
ds = getDataSource();
} catch (NamingException e) {
e.printStackTrace();
}
}
public static MyDataSource getInstance(){
return mds;
}
public Connection getConnection() throws SQLException, NamingException {
Connection myConnect = ds.getConnection();
return myConnect;
}
private DataSource getDataSource() throws NamingException {
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass( "com.mysql.jdbc.Driver" );
} catch (PropertyVetoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cpds.setJdbcUrl( "jdbc:mysql://195.195.xx.xx:3306/dbName" );
cpds.setUser("lemmy");
cpds.setPassword("xxx");
cpds.setMaxIdleTime(180);
cpds.setMaxPoolSize(100);
return cpds;
}
}
连接类:
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
public class DbConnection {
public Connection c;
public DbConnection() throws NamingException, SQLException {
c = getConnection();
}
public Connection getConnection() throws SQLException, NamingException {
Connection myConnect = MyDataSource.getInstance().getConnection();
return myConnect;
}
public void close(){
JDBCUtils.close(this.c);
}
}
关闭连接等
import java.sql.*;
public class JDBCUtils {
static public void close (ResultSet rs) {
try { if (rs!=null) rs.close(); } catch (Exception e) {}
}
// Works for PreparedStatement also since it extends Statement.
static public void close (Statement stmt) {
try { if (stmt!=null) stmt.close(); } catch (Exception e) {}
}
static public void close (java.sql.Connection conn) {
try { if (conn!=null) conn.close(); } catch (Exception e) {}
}
}
示例用法:
String myQuery = null;
DbConnection myConnect = null;
Statement myStatement = null;
ResultSet rs = null;
try {
myConnect = new DbConnection();
myStatement = myConnect.c.createStatement();
// Do stuff here
}catch (SQLException e) {
out.println("SQL Error: "+e);
} finally {
JDBCUtils.close(rs);
JDBCUtils.close(myStatement);
myConnect.close();
}
【问题讨论】:
标签: java singleton datasource connection-pooling c3p0