近期在一个数据推送服务器中,为了方便起见使用Sqlite作为数据库引擎,以方便部署。在初始版本中,为了方便全局访问,定义了一个DBHelper类作为数据库访问类,使用单实例,并使用一个静态方法GetInstance()。后面经过仔细思考,发现,这样可能会存在并发访问冲突,因此加入连接池机制来防止冲突。
原理是这样:定义一个静态的DBHelper的栈对象,并且在初始化的时候创建N个连接。每次需要使用数据连接的时候调用GetInstance(),该函数先检测栈是否非空,是则弹出一个DBHelper对象,否则,创建一个新的DBHelper对象。在数据访问完成后,再调用ReleaseInstance将DBHelper对象压入栈中。
下面给出代码,去除了DBHelper的业务逻辑部分。
class DBHelper { private static Stack<DBHelper> mInstancePool = new Stack<DBHelper>(); private static object mLockIntancePool=new object(); public static DBHelper GetInstance() { DBHelper dbHelper = null; lock (mLockIntancePool) { if (mInstancePool.Count != 0) { dbHelper = mInstancePool.Pop(); } else { dbHelper = new DBHelper(); } } return dbHelper; } public static void ReleaseInstance(DBHelper dbHelper) { lock (mLockIntancePool) { mInstancePool.Push(dbHelper); } } static DBHelper() { for (int i = 0; i < 10; i++) { mInstancePool.Push(new DBHelper()); } } private DBHelper() { mConnection = SQLiteClass.CreateConnectionFromFile(@"data.db"); }
}