现在的位置: 首页 > 综合 > 正文

健壮的JDBC单例

2018年05月18日 ⁄ 综合 ⁄ 共 1967字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.