健壮的JDBC单例

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


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值