|
使用jdbc测了一下sqlite3的插入数据的效率,使用整体事务与不使用整体事务,差别非常明显。 cpu: 1G, 内存:512MB
使用整体事务:1000000条记录,需要93秒钟。
使用逐个插入提交事务:1秒钟只能处理20条记录。
如何同时使用光盘Sqlite数据库和可读写的Sqlite临时表的解决方案。
系统设置:
在服务器端放置Sqlite临时表数据库文件。
程序处理:
1. 通过ATTACH命令建立指向服务器端Sqlite数据库的连接字符串。
2. 利用连接字符串同时使用数据表和临时表。(main指向自身)
3. 使用结束以后,释放连接字符串。
此部分处理可以考虑共通化,后继程序使用统一的固定连接字符串XXXX访问临时表
|
DAO中同时使用光盘Sqlite数据库和Sqlite临时表的例子:
//通过ATTACH命令建立指向Sqlite临时表数据库的连接字符串
Statement stmt =con.createStatement();
sql= "attach database 'c:/sqlite/test.db' as dbtest" ;
stmt.executeUpdate(sql);
//利用连接字符串同时使用数据表和临时表。(main指向自身)
sql="insert into dbtest.testtbl(id)
select main.bfs.id from dbtest.bfs, main.bfs where main.bfs.id=dbtest.bfs.id";
stmt.executeUpdate(sql);
//此部分处理可以考虑共通化,统一释放固定连接字符串XXXX。
|
//使用结束以后,释放连接字符串
sql="detach dbtest";
stmt.executeUpdate(sql);
2.3.4 JDBC 中使用preparedstatement
使用preparedstatement时,做长时间大量数据的插入时,会出现内存泄漏,导致插入速度变慢。在select的时候没有发现这个问题。
可以使用Statement来解决,但是对于字符串在拼接SQL语句时,需要先content.replaceAll(“’”, “’’”), 即把其中的单引号换成连续的两个单引号。
DAOFactory类中修改函数getCreator,用来生成SQLite相关的对象。
public static DAOCreator getCreator(int aDBType) {
if (aDBType == DAOFactory.DB_TYPE_SQLITE) {
return new SQLiteDAOCreator();
} else {
int type = getConfiguration();
switch (type) {
case DB_TYPE_ORA:
return new OracleDAOCreator();
case DB_TYPE_SQLSERVER:
return new SQLServerDAOCreator();
default:
final LogManager LOG = new LogManager(DAOFactory.class
.getName());
BtLogMessage msg = new BtLogMessage();
msg.setOptFail("Parameter is not valid.");
LOG.fatal(msg);
return null;
}
}
}
SQLiteDAOCreator中生成SQLite相关对象时,为每个对象重写方法getConnection
public SearchSelectDAO getSearchSelectDAO() throws OprtException {
final String METHOD_NAME = "getSearchSelectDAO";
// TODO Auto-generated method stub
return new SQLiteSearchSelectDAO() {
public void getConnection() throws OprtException {
this.con = SQLiteBaseDAOUtil.getConnection(this
.getSqliteDBFile());
}
};
public class SQLiteBaseDAOUtil {
private static final String CLASS_NAME = "SQLiteBaseDAOUtil";
public static Connection getConnection(String sqliteDBFile) throws OprtException {
// TODO Auto-generated method stub
final String METHOD_NAME = "getConnection";
if (sqliteDBFile == null){
throw new OprtException
(CLASS_NAME,METHOD_NAME, "No data file specified", null, null);
}
try {
Class.forName("SQLite.JDBCDriver");
return DriverManager.getConnection("jdbc:sqlite:/" + sqliteDBFile, "", "");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
throw new OprtException
(CLASS_NAME,METHOD_NAME, "No suitable driver", null, e);
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new OprtException(CLASS_NAME,METHOD_NAME,
"Error when connect to SQLite Database", null, e);
}
}
}
l 直接使用DAO
SearchSelectDAO dao = DAOFactory. getCreator(DAOFactory.DB_TYPE_SQLITE)
.getSearchSelectDAO();
dao.setSqliteDBFile(DiskUtil.getSQLiteDBFile());
//SQLiteSearchSelectDAO的构造方法中不再调用getConnection方法
dao.getConnection();
dao.findTitle(11);
l 利用Manager间接使用DAO
SearchManager searchManager = new SearchManager();
searchManager.setSQLite(true);
searchManager.setSqliteDBFile(DiskUtil.getSQLiteDBFile());
searchManager.test();
Manager中使用到的DAO类时,参考“直接使用DAO” (阅读次数:)
|