Jeasyframe 我们不专业,但我们很用心.

windows下安装Timesten并创建数据库实例及使用jdbc连接

Timesten,内存数据库,适用于大数据量高并发的项目需求.数据存储在内存中,历史数据会存储在文件中.本文是笔者经过实践后留下的心得,也是给自己的一个备忘.

一.下载与安装.

1.到oracle官网下载Timesten数据库,根据操作系统是64位还是32位进行下载,下载后解压缩是一个timesten112280.win64的文件夹,我下载的是64位的.oracle用的是12c,这个版本官网说是支持11g以上版本.

2.安装前有几个问题先说明,免得走弯路,timesten不支持win8以上版本,不用试了,肯定装不上.安装前必须关掉360或者QQ安全管家以及其他类似的安全软件.否则无法启动服务.安装前注意重启电脑.

3.好了,剩下的就是安装了,一路下一步,注意最后一步选下jdk版本就可以了,这里提供了jdk5和jdk6还有个none,选jdk6的话支持jdk6和jdk7,选jdk5的话我就不说啥了,既然你都这么老古董了你还用什么timesten!

4.安装好后进行创建数据库实例,timesten创建数据库需要到ODBC中创建,依次打开控制面板-管理工具-设置数据源.

5.打开后点击"系统DSN",这时有可能会提示你没有权限啥的,不用管.

6.点右边的"添加",选择如下图所示的Timesten Data Manager.

QQ截图20150825091401.png

7.按下图填好Data Source选项卡

QQ截图20150825092050.png

8.打开General Connection,在这里找到User ID,输入oracle的用户名.我的是wsuser.

QQ截图20150825092320.png

9.打开TimesTen Cache,输入oracle的密码,oracle的网络服务名.

QQ截图20150825092413.png

10.点击OK创建该数据源.其实除了第一个选项卡,其他的都是为了缓存oracle数据用的,如果你不需要将oracle和timesten结合使用,你可以不配置后面的.

二.配置Timesten用户,表空间,表.

1.打开CMD.输入ttstatus ttwsdb,前面是关键字,后面是你创建的数据源名称.如下图可以看到ttwsdb已经生效并运行了,可以看到占用的端口等信息.

QQ截图20150825093802.png

2.连接TT数据库,输入 ttisql ttwsdb,前面是关键字,后面是你创建的数据源名称,也就是数据库名,如下图可以看到已经连接到TT数据库了.第一次连接不需要用户名密码.我这是因为已经创建了用户,所以需要密码.

QQ截图20150825094407.png

3.创建TT用户.命令为:

Command>create user wsuser identified by wsuser;//其中标红的wsuser为你要创建的用户名. 用户名和密码都为wsuser

Command>grant all to wsuser;//附权限.

Command>quit;//退出.

4.使用sql developer连接Timesten.

oracle官网下载sqldeveloper,这个就不需要赘述了,用过oracle的应该都用过pl/sql和sqldeveloper.

下载后打开sqldeveloper,创建新的连接,可以看到如下图所示的Timesten标签.

QQ截图20150825095315.png

看下图及注释.

QQ截图20150825095513.png

连接成功后你可以自行创建表,列,数据等等,跟oracle的操作方式是一样的,SQL语句也是符合标准ORACLE SQL语法的.

QQ截图20150825095603.png

这里说下TT数据库中的类型与oracle不同的地方,其实oracle的数据库类型,TT都支持,但TT也提供了一些它自己的数据类型.

QQ截图20150825095814.png

在这里我的意见是随便,因为你几乎看不出什么区别来.TT自带的类型在int方面进行了细化,效率上比oracle的number肯定要高一些.


三.使用JDBC连接Timesten.

1.使用JDBC连接Timesten需要先到ODBC中创建客户端.

2.同样我们打开控制面板-管理工具-设置数据源-右面的添加,选择TimesTen Client.

3.按下图填好信息.

QQ截图20150825100832.png

4.可通过下面的按钮测试数据源连接.

5.配置成功后,可使用java进行连接Timesten了.jdbc的驱动在timesten安装包下的lib文件夹中,ttjdbc6.jar.

6.我是通过spring来管理的timesten,所以我使用spring数据源.如果你不是,你可以按照普通的jdbc方式操作,只是连接的参数不通过而已.

spring配置文件代码

<bean id="ttDataSource" class="com.timesten.jdbc.TimesTenDataSource"> 

  <property name="url" value="jdbc:timesten:client:DSN=ttwsdbclient"/>  

  <property name="user" value="wsuser"/> 

  <property name="password" value="wsuser"/>

  <property name="oraclePassword" value="wsuser"/>

 </bean>

 

 <bean id="ttJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 

  <property name="dataSource" ref="ttDataSource" />

 </bean>


 <!--timesTenUtil为我自己的工具类,下面会贴上该类代码-->

 <bean id="timesTenUtil" class="com.djzhou.util.TimesTenUtil"> 

  <property name="ttJdbcTemplate" ref="ttJdbcTemplate" />

 </bean>

 TimesTenUtil工具类代码,这里的我加入了不用spring的连接方式,方便大家参考.我平时用都是使用spring的jdbc

package com.djzhou.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.JdbcTemplate;
public class TimesTenUtil {
 private String timesTenURL;
 private Connection conn;
 private PreparedStatement ps = null;
 private ResultSet rs = null;
 private JdbcTemplate ttJdbcTemplate;
 
 static{
  try {
   Class.forName("com.timesten.jdbc.TimesTenDriver");
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 
 public List<Map<String, Object>> executeQuerySpring(String sql, Object... parameters){
  List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
  results=ttJdbcTemplate.queryForList(sql, parameters);
  return results;
 }
 public Object executeQuerySpring(String sql,String columnName, Object... parameters){
   Object result=0;
   List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
   list=ttJdbcTemplate.queryForList(sql, parameters);
   if(list!=null&&list.size()>0){
    result=list.get(0).get(columnName);
   }
   return result;
  }
  public void executeUpdateSpring(String sql, Object... parameters){
   ttJdbcTemplate.update(sql, parameters);
  }
 
 /**
  * 查询并返回数组对象泛型结果集 可在内部关闭
  * @param sql
  * @param parameters
  * @return
  */
 public List<Object[]> executeQuery(String sql, Object... parameters) {
  List<Object[]> results = new ArrayList<Object[]>();
        try {
            conn = getConn();
            ps = conn.prepareStatement(sql);
             
            if (parameters != null) {
                for (int i=0; i<parameters.length; i++) {
                    ps.setObject(i+1, parameters[i]);
                }
            }
             
            rs = ps.executeQuery();
             
            ResultSetMetaData rsmd = rs.getMetaData();
            int column = rsmd.getColumnCount();
            while (rs.next()) {
                Object[] objects = new Object[column];
                for (int i=1; i<=column; i++) {
                    objects[i-1] = rs.getObject(i);
                }
                results.add(objects);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        } finally {
            closed(conn, ps, rs);
        }
        return results; 
    }
 
 /**
  * 更新方法-单一
  * @param sql
  * @param parameters
  */
    public void executeUpdate(String sql, Object... parameters) {
         
            try {
                conn = getConn();
                ps = conn.prepareStatement(sql);
                //给?赋值
                if (parameters != null) {
                    for (int i=0; i<parameters.length; i++) {
                        ps.setObject(i+1, parameters[i]);
                    }
                }
                //执行语句
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage());
            } finally {
                //关闭资源
             closed(conn, ps, rs);
            }
    }
    
    /**
     * 执行多条更新语句 在事务中处理 不带参数
     * @param sqls
     * @param parameters
     */
    public void executeUpdate(String[] sqls) {
        try {
            //得到连接
            conn = getConn();
            //多个sql语句,考虑事务
            conn.setAutoCommit(false);
            for (int i=0; i<sqls.length; i++) {
                ps = conn.prepareStatement(sqls[i]);
                ps.executeUpdate();
            }
            conn.commit();
        } catch (SQLException e) {
            //回滚
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        } finally {
            closed(conn, ps, rs);
        }
    }
    
    /**
     * 执行多条更新语句 在事务中处理 带参数(必须) 参数为二维数组
     * @param sqls
     * @param parameters
     */
    public void executeUpdate(String[] sqls, String[][] parameters) {
        try {
            //得到连接
            conn = getConn();
            //多个sql语句,考虑事务
            conn.setAutoCommit(false);
            for (int i=0; i<sqls.length; i++) {
                if (parameters[i] != null) {
                    ps = conn.prepareStatement(sqls[i]);
                    for (int j=0; j<parameters[i].length; j++) {
                        ps.setString(j+1, parameters[i][j]);
                    }
                    ps.executeUpdate();
                }
 
            }
            conn.commit();
        } catch (SQLException e) {
            //回滚
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        } finally {
            closed(conn, ps, rs);
        }
    }
     
 
    
    
    /************私有方法******************/
 /**
  * 获取URL地址
  * @return
  */
 private String getTimesTenURL() {
  //timesTenURL=StaticUtil.TIMESTEN_URL;
  timesTenURL="jdbc:timesten:client:DSN=ttwsdbclient";
  return timesTenURL;
 }
 /**
  * 获取连接
  * @return
  */
 private Connection getConn() {
  try {
   conn=DriverManager.getConnection(getTimesTenURL());
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return conn;
 }
 /**
  * 释放资源
  * @param conn
  * @param st
  * @param rs
  */
 private void closed(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                  
                e.printStackTrace();
            } finally {
                if (st != null) {
                    try {
                        st.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        if (conn != null) {
                            try {
                                conn.close();
                            } catch (SQLException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    }
 public JdbcTemplate getTtJdbcTemplate() {
  return ttJdbcTemplate;
 }
 public void setTtJdbcTemplate(JdbcTemplate ttJdbcTemplate) {
  this.ttJdbcTemplate = ttJdbcTemplate;
 }
 
 
 
 
}

 以上就完成了jdbc连接timesten的功能.


下面说下timesten使用心得,timesten在生产环境中对内存要求比较高,所以在处理大数据和高并发时,建议生产机器的配置尽量高一点,在频繁更新数据库操作时,会出现连接断开的问题,目前暂时没找到解决方案.

作者:djzhou 分类:知识分享 浏览:1025 评论:0
留言列表
发表评论
来宾的头像