【引用请注明出处:http://blog.csdn.net/bhq2010/article/details/9109539】
首先说说我对JDBC单例的理解,之前的一篇博客中对JDBC单例和连接池做了对比:http://blog.csdn.net/bhq2010/article/details/7478659
可以看出C3P0适合处理并发量大的访问,不会因为一个慢查询导致后来的查询一直等待,性能也还说得过去。JDBC单例适合小并发量的频繁数据存取,非常稳定可靠。
所以如果是面向大量用户的应用程序,还是使用连接池比较好。
不过言归正转,之前那篇博客里的JDBC单例有问题:
1、不应该把驱动注册写在静态块里。
驱动注册加载了一些列的JDBC类,这些类的声明周期不一定和当前的类一样,所以写在静态块了不好;
2、只要重用connection即可提高数据库访问的速度,statement和resultset可以在每次需要的时候都重建,重用statement和resultset并不能提高效率,反而会导致异常;
一下贴一个例程,其中的ConfigFactory是自定义的配置类,Log是自定义的日志类:
【引用请注明出处:http://blog.csdn.net/bhq2010/article/details/9109539】
mport java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class SingleDBA implements DBA { private Connection connection = null; private static Log dblog = null; private static String DBClassName = null; private static String DBName = null; private static String DBUrl = null; private static String DBUser = null; private static String DBPassword = null; protected SingleDBA() { } static { try { DBClassName = ConfigFactory.getInstance().get("db.classname"); DBName = ConfigFactory.getInstance().get("db.name"); DBUrl = ConfigFactory.getInstance().get("db.url"); DBUser = ConfigFactory.getInstance().get("db.user"); DBPassword = ConfigFactory.getInstance().get("db.password"); dblog = LogFactory.getInstance().getLog("db"); } catch (Exception e) { e.printStackTrace(); } } @Override public Connection getConnection() throws SQLException, ClassNotFoundException, InterruptedException { if (connection == null || connection.isValid(10) == false) { Class.forName(DBClassName); connection = DriverManager.getConnection(DBUrl + DBName, DBUser, DBPassword); if (connection == null) { dblog.exception("Can not load jdbc and get connection."); } } return connection; } @Override public void close(Connection conn) { } @Override public void close(Statement stat) { try { if (stat != null) { stat.close(); stat = null; } } catch (SQLException e) { dblog.exception(e); } } @Override public void close(ResultSet rest) { try { if (rest != null) { rest.close(); rest = null; } } catch (SQLException e) { dblog.exception(e); } } }