我目前正在开发用java(7)实现的桌面应用程序,它管理sql数据库中的大量数据记录。只有几个表,但它们包含大量的记录。我需要对单个表执行复杂的查询,但不需要执行复杂的联接操作。在

到目前为止,我一直在与博士后合作。但由于它是一个桌面单用户应用程序,我也考虑过使用sqlite(不用说,这也会降低设置的复杂性)。所以我写了一个简单的python脚本来做一些性能测试。令我惊讶的是,首先,sqlite的实际执行情况如何;其次,python中的查询响应时间比java中的要小得多。在

一个常见的场景是根据id列表选择一批记录。在python中,我使用以下代码来测试响应时间:rand_selection = ','.join([str(int(random.random()* MAX_INDEX )) for i in xrange(PAGE_SIZE)])

start = time.time();

c = db.cursor();

res = c.execute("SELECT * FROM bigtable WHERE id in ("+rand_selection+")");

reslist = [str(t) for t in res]; c.close();

print( time.time() - start );

对于MAX_INDEX=111000和PAGE_SIZE=100,这给了我大约5毫秒的增量。在

好吧,太好了。现在,让我们转到java:我使用jdbc-sqlite驱动程序。我在完全相同的表上执行了完全相同的查询,查询时间总是在200毫秒左右,这对于我的用例来说是不可接受的。在

我错过了什么吗?在

我知道这是一个非常普遍的问题。但是也许有人对JDBCSQLite有一定的经验,并且从经验中知道发生了什么

[编辑]:使用timit.default_计时器()正如建议的(谢谢,马蒂恩·皮特斯)给了我相似的结果。在

[Edit2]:根据CL的建议,我编写了java代码的简化版本。使用这段代码,我可以而不是验证结果和响应时间与python代码相同。但是,我在另一台机器上测试了这一点,使用了不同的jdk(openjdk7与oraclejdk7)。诚然,我的其他测试代码很可能有一些问题。在

[编辑2013-08-16]:我现在使用原始设置执行相同的测试。我还把它和博士后做了比较。在

^{pr2}$

测试代码(请原谅草率的编码…):package ch.dsd;

import java.sql.*;

import java.util.ArrayList;

import java.util.List;

import java.util.Properties;

public class Main {

private static int COL_COUNT = 20;

private static int TESTRUNS = 20;

private static int INDEX_COUNT = 64;

/*

CREATE TABLE bigtable ( id INTEGER PRIMARY KEY ASC, prop0 real, prop1 real, ... , prop19 real );

*/

static class Entity {

private long id;

private ArrayList properties = new ArrayList(COL_COUNT);

public Entity() {

for( int i = 0; i < COL_COUNT; i++) {

properties.add(0.0);

}

}

public long getId() {

return id;

}

public void setId(long id) {

this.id = id;

}

public void setProperty(int idx, double prop) {

properties.set(idx, prop);

}

public double getProperty(int idx) {

return properties.get(idx);

}

@Override

public String toString() {

StringBuilder sb = new StringBuilder();

for( double prop: properties ) {

sb.append(prop);

sb.append(",");

}

sb.delete(sb.length()-1, sb.length());

return sb.toString();

}

}

private static String placeholders( int n ) {

StringBuilder sb = new StringBuilder();

if( n > 0 ) {

sb.append("?");

for( int i = 1; i < n; i++ )

sb.append(",?");

return sb.toString();

}

return "";

}

private static void setRandomIdcs( PreparedStatement ps, int start, int stop, int max ) throws SQLException {

for( int i = start; i <= stop; i++ ) {

ps.setLong(i, (long) ((double) max * Math.random()));

}

}

private static void setRandomValues( PreparedStatement ps, int start, int stop ) throws SQLException {

for( int i = start; i <= stop; i++ ) {

ps.setDouble(i, Math.random());

}

}

private static void readFromResultSet( ResultSet rs, List lst ) throws SQLException {

while(rs.next()) {

final Entity e = new Entity();

e.setId(rs.getLong(1));

for( int i = 0; i < COL_COUNT; i++ )

e.setProperty(i, rs.getDouble(i+2));

lst.add(e);

}

}

public static void performTest(Connection c) throws SQLException {

final PreparedStatement ps = c.prepareStatement("SELECT * FROM bigtable WHERE id in ("+placeholders(INDEX_COUNT)+")");

ArrayList entities = new ArrayList();

for( int i = 0; i < TESTRUNS; i++ ) {

setRandomIdcs( ps, 1, INDEX_COUNT, 1000000 ); // there are one million entries stored in the test table

long start = System.currentTimeMillis();

final ResultSet rs = ps.executeQuery();

readFromResultSet(rs, entities);

// System.out.println(entities.get(INDEX_COUNT-1));

System.out.println("Time used:" + (System.currentTimeMillis() - start));

System.out.println("Items read:" + entities.size());

rs.close();

entities.clear();

}

ps.close();

}

public static void createPSQLTable(Connection c) throws SQLException {

final String create_stmt = "CREATE TABLE IF NOT EXISTS bigtable (id SERIAL PRIMARY KEY, " +

"prop0 double precision,prop1 double precision,prop2 double precision,prop3 double precision,prop4 double precision,prop5 double precision,prop6 double precision,prop7 double precision,prop8 double precision,prop9 double precision,prop10 double precision,prop11 double precision,prop12 double precision,prop13 double precision,prop14 double precision,prop15 double precision,prop16 double precision,prop17 double precision,prop18 double precision,prop19 double precision)";

final PreparedStatement ps = c.prepareStatement(create_stmt);

ps.executeUpdate();

ps.close();

}

public static void loadPSQLTable( Connection c ) throws SQLException {

final String insert_stmt = "INSERT INTO bigtable VALUES (default, " + placeholders(20) + ")";

final PreparedStatement ps = c.prepareStatement(insert_stmt);

for( int i = 0; i < 1000000; i++ ) {

setRandomValues(ps, 1, 20);

ps.executeUpdate();

}

c.commit();

}

public static void main(String[] args) {

Connection c = null;

try {

Class.forName("org.sqlite.JDBC");

c = DriverManager.getConnection("jdbc:sqlite:/Users/dsd/tmp/sqlitetest/testdb.db");

c.setAutoCommit(false);

performTest(c);

c.close();

System.out.println("POSTGRES");

System.out.println("========");

final Properties props = new Properties();

props.setProperty("user", "dsd");

c = DriverManager.getConnection("jdbc:postgresql:testdb", props);

c.setAutoCommit(false);

createPSQLTable(c);

// loadPSQLTable(c);

performTest(c);

c.close();

} catch ( Exception e ) {

System.err.println( e.getClass().getName() + ": " + e.getMessage() );

System.exit(0);

}

}

}

结果:Time used:348

Items read:64

Time used:407

Items read:64

Time used:259

Items read:64

Time used:341

Items read:64

Time used:325

Items read:64

Time used:145

Items read:64

Time used:70

Items read:64

Time used:98

Items read:64

Time used:91

Items read:64

Time used:134

Items read:64

Time used:68

Items read:64

Time used:51

Items read:64

Time used:51

Items read:64

Time used:51

Items read:64

Time used:55

Items read:64

Time used:67

Items read:64

Time used:56

Items read:64

Time used:90

Items read:64

Time used:56

Items read:64

Time used:51

Items read:64

POSTGRES

========

Time used:75

Items read:64

Time used:58

Items read:64

Time used:31

Items read:64

Time used:26

Items read:64

Time used:34

Items read:64

Time used:6

Items read:64

Time used:5

Items read:64

Time used:4

Items read:64

Time used:5

Items read:64

Time used:6

Items read:64

Time used:5

Items read:64

Time used:6

Items read:64

Time used:4

Items read:64

Time used:28

Items read:64

Time used:3

Items read:64

Time used:4

Items read:64

Time used:4

Items read:64

Time used:4

Items read:64

Time used:3

Items read:64

Time used:5

Items read:64

sqlite java需要按照,SQLite:java/jdbsqlite和python/sqlite3的区别相关推荐

  1. java中删除sqlite数据库语句_sqlite数据库的介绍与java操作sqlite的实例讲解

    sqlite数据库的介绍与java操作sqlite的实例讲解 发布时间:2020-10-03 05:40:34 来源:脚本之家 阅读:92 作者:Lee_Tech sqlite是啥? 1.一种轻型数据 ...

  2. Java操作数据库Sqlite样例代码

    Java对数据的操作需要通过JDBC中间件,需要先配置好sqlite-jdbc-(版本号).jar. JDBC学习教程可参考:http://www.runoob.com/w3cnote/jdbc-us ...

  3. java spring sqlite,Spring Boot+MyBatis+SQLite配置

    Spring Boot+MyBatis+SQLite配置例子参考下面 创建新项目 项目类型务必选择箭头指定的类型,否则不会自动生成代码模版 增加依赖项 junit junit 4.13.1 test ...

  4. Java中使用SQLite数据库

    SQLite相关资料可以去Wikipedia查看. 下载SQLite JDBC驱动请点这里 使用和其他数据库驱动一样,如果用过MySQL会很容易理解. 顺便提供一个最简单的数据库连接类(不要因为太简单 ...

  5. sqlite java blob_【转】好东西!sqlite3中BLOB数据类型存储大对象运用示例

    1:常用接口 个人比较喜欢sqlite, 使用最方便,唯一的准备工作是下载250K的源:而且作者很热心,有问必答. 以下演示一下使用sqlite的步骤,先创建一个数据库,然后查询其中的内容.2个重要结 ...

  6. sqlite和java_Java和SQLite

    小编典典 在使用SQLite和Java 搜索信息时找到了你的问题.只是想我要补充我的回答,我也贴在我的博客. 我已经用Java编码了一段时间了.我也了解SQLite,但从未使用过--好吧,我在其他应用 ...

  7. Java基础第一讲:Java的故事和Java编程环境搭建

    { Android学习指南 } 适于自学的ANDORID学习指南,基于ANDROID 2.2.2.3.3及3.0版本讲解 <ANDROID学习指南>目录 RSS Java基础第一讲:Jav ...

  8. SQLite之C#连接SQLite

    SQLite之C#连接SQLite 2015-05-05 17:52  糯米粥  阅读(40651)  评论(1)  编辑  收藏 我的程序突然不能访问数据库了,回过头来再看这文章,才知道是自己的几天 ...

  9. 【玩转SQLite系列】(二)SQLite创建和打开数据库的三种方式

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53234396 本文出自[DylanAndroid的博客] [玩转SQLite系 ...

最新文章

  1. ElasticSearch大数据分布式弹性搜索引擎使用
  2. mongodb 3.4 安装_暴雨免安装中文版下载
  3. java什么叫一致性,java-顺序一致性易失性说明
  4. 【洛谷 - U43391】不是0-1背包的暴力AC(思维,二分,可转化为二元组问题,复习暴力dfs总结)
  5. ZZULIOJ 1061:顺序输出各位数字
  6. qt 工作流_助力提升企业生产力-工作流管理
  7. php跨域传sessionid,php中http与https跨域共享session的解决方法
  8. 兔子问题JAVA编程题
  9. junit框架——单元测试
  10. 如何在软件里显示编译时间
  11. onlyoffice 自动保存_onlyoffice在线编辑
  12. # RPGMaker MV 基础 1 : 项目目录认识
  13. 如何设计接口测试用例?(文末送接口测试用例模板)
  14. c语言实现皇帝翻牌游戏
  15. 真香!端午节到来,我用Python画了几个粽子送给女票,女票差点吃了我的电脑...
  16. 【强化记忆】生物选修三填空题考点强化记忆2-胚胎工程、安全伦理问题、生态工程——2017年2月25日...
  17. Python基于face-alignment实现2D/3D人脸关键点检测
  18. HTML的基础入门,快来看看吧~
  19. 十三、JavaSE-IO体系
  20. 高级网吧光纤组建网络技术方案(转)

热门文章

  1. 力扣: 88. 合并两个有序数组
  2. 第一章 操作系统引论
  3. 【vue.js】vue后台项目权限功能实现思路
  4. Jedis连接Redis集群
  5. php读取zip文件,php如何读取zip内容?(zip_entry_read函数的使用)
  6. qmoc文件_手动生成MOC文件
  7. 全网最全程序员效率工具及小技巧
  8. 轻松读懂数据结构系列:早操排队图解选择排序
  9. 快速掌握mysql,可备用查找相关用法(吐血整理)
  10. String s=a+b+c,到底创建了几个对象?