【引用请注明出处: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);
}
}
}