注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一线天色 天宇星辰

天下武功,唯快不破

 
 
 

日志

 
 

轻量级本地化数据库SQLite的应用  

2012-07-04 12:29:12|  分类: 软件开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

是实际开发应用中最常使用的就是数据库了,但是针对客户端软件,难道在客户端安装的时候也安装一个数据库实例?显然不现实,我之前的做法是直接读写文件,速度还比较快,但是有一个很严重的问题,当我写入的文件需要进行检索时就比较麻烦,或者做一些统计分析的时候就比较麻烦!

比如我有这么一个需求,在用户的本地设一个客户端,用于收集用户上网搜索用的关键字,然后将这些关键字统计后送往服务器,以便进行分析给用户投放精准广告!用文件就很麻烦!用文件就很麻烦!于是SQLite这种小型本地数据库就很方便!但是值得注意的是,因为他是基于本地文件的,因此每次操作都会锁这个文件,如果多线程执行就会报下面一个异常!

轻量级本地化数据库SQLite的应用 - 一线天色 天宇星辰 - 一线天色 天宇星辰

         

废话不多说,我们直接来看如何使用!SQLite因为是基于本地文件的,和Access一样,无需安装服务端组件(当然你安装也是可以的,安装具体可参见http://www.sqlite.org/ 下载完成后 编译 安装即可),只要一个客户端组件即可!Java版本的客户端可在http://www.zentus.com/sqlitejdbc/下载!

         示例代码:

DBConnection.java

package com.yhj.sqlLite;

 

import java.io.File;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

 

/**

 * @DescribedDB连接

 * @author YHJ create at 2012-7-2 下午07:15:13

 * @FileNmae com.yhj.sqlLite.DBConnection.java

 */

public class DBConnection {

 

    private final static String path = System.getProperty("user.dir")+"/data.db";

 

    private final static String tableName = "keys" ;

   

    private final static String reportTableName = "statisKeys";

 

    //启动的时候 检测数据文件是否存在 如果不存在 创建数据文件 如果创建失败 启动失败 系统退出

    static{

       try {

           File file = new File(path);

           if(!file.exists()){

              file.createNewFile();

           }

           Connection conn = getConnection();

           Statement stat = conn.createStatement();

           ResultSet rs = stat.executeQuery("SELECT name FROM sqlite_master WHERE type='table' and name = '"+tableName+"';");

           if(!rs.next()){

              conn.setAutoCommit(false);

              stat.executeUpdate("create table "+tableName+" (key ,userName , time ,remark);");

              stat.executeUpdate("create table "+reportTableName+" (key ,counts , beginTime ,endTime ,remark);");

              conn.commit();

           }

           closeConnection(conn);  

       } catch (Exception e) {

           e.printStackTrace();

           System.exit(-1);

       }

    }

 

 

    /**

     * 获取连接

     * @return

     * @Author YHJ create at 2012-7-2 下午07:18:47

     */

    public static Connection getConnection(){

 

       try {

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

           return DriverManager.getConnection("jdbc:sqlite:"+path);

       } catch (Exception e) {

           e.printStackTrace();

       }

       return null;

    }

    /**

     * 关闭连接

     * @param connection

     * @Author YHJ create at 2012-7-2 下午07:33:33

     */

    public static void closeConnection(Connection connection){

       try {

           if(null!=connection && !connection.isClosed())

              connection.close();

       } catch (SQLException e) {

           e.printStackTrace();

       }

    }

 

    public static void main(String[] args) {

       DBConnection.closeConnection(DBConnection.getConnection());

    }

 

 

}

 

SearchPage.java

package com.yhj.sqlLite;

 

import java.sql.Connection;

import java.sql.Date;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

 

/**

 * @Described:搜索页面

 * @author YHJ create at 2012-7-3 下午01:28:10

 * @FileNmae com.yhj.sqlLite.SearchPage.java

 */

public class SearchPage {

   

    private ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

   

    /**

     * @Described:内部任务类

     * @author YHJ create at 2012-7-3 下午02:23:38

     * @FileNmae com.yhj.sqlLite.SearchPage.java

     */

    class Task implements Runnable{

      

       private String userName;

       private String key;

      

       public Task(String userName,String key) {

           this.userName = userName;

           this.key = key;

       }

 

       @Override

       public void run() {

           try {

              Connection conn = DBConnection.getConnection();

              PreparedStatement statement = conn.prepareStatement("insert into keys values(?,?,?,?)");

              statement.setString(1, key);

              statement.setString(2, userName);

              statement.setDate(3, new Date(System.currentTimeMillis()));

              statement.setString(4, "用户搜索");

              statement.executeUpdate();

              DBConnection.closeConnection(conn);

           } catch (SQLException e) {

              e.printStackTrace();

           }

       }

      

    }

   

    /**

     * 搜索信息

     * @param userName

     * @param key

     * @throws SQLException

     * @Author YHJ create at 2012-7-3 下午01:40:03

     */

    public String search(String userName,String key) throws SQLException{

//     service.execute(new Task(userName, key));

       new Task(userName, key).run();//使用线程池会导致文件被锁

       return Resource.get(key);

    }

 

}

 

Client.java

package com.yhj.sqlLite;

 

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

 

/**

 * @Described:调用客户端

 * @author YHJ create at 2012-7-3 下午02:06:28

 * @FileNmae com.yhj.sqlLite.Client.java

 */

public class Client {

   

    /**

     * 初始化数据

     * @param users

     * @param keys

     * @Author YHJ create at 2012-7-3 下午02:12:36

     */

    public static void initParam(List<String> users,List<String> keys){

       users.add("张三");

       users.add("李四");

       users.add("王五");

       users.add("天雨星");

       users.add(null);

       keys.add("百度");

       keys.add("一线天色");

       keys.add("天宇星辰");

       keys.add("谷歌");

       keys.add("张麻子");

    }

 

    //主函数如入口

    public static void main(String[] args) throws SQLException {

       SearchPage page = new SearchPage();

       List<String> users = new ArrayList<String>();

       List<String> keys = new ArrayList<String>();

       Random random = new Random();

       initParam(users, keys);

       for(long i = 0;i<Integer.MAX_VALUE;++i){

           String user = users.get(random.nextInt(users.size()));

           String key = keys.get(random.nextInt(keys.size()));

           String msg = page.search(user, key);

           System.out.println(i+" ==> user:"+user+" search:"+key+" msg:"+msg);

       }

 

    }

 

 

}

  评论这张
 
阅读(1299)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017