分类: Java
2015-07-08 15:21:29
参考文章:
本文介绍Clojure如何使用JDBC访问Oracle数据库,我们会学习clojure.java.jdbc中的一些基本函数。
一、环境
OS: Oracle Linux Server release 6.6
Java:java version "1.7.0_79"
Lein:Leiningen 2.5.1 on Java 1.7.0_79 OpenJDK 64-Bit Server VM
Clojure:1.6.0
IDE:intellij IDEA 14.1.4
依赖软件:clojure.java.jdbc – 通用jdbc驱动:最新版本:0.3.7
数据库连接池
一般情况下首选c3p0、dbcp,久经考验,比较成熟稳定。
dbcp: [clojure.jdbc/clojure.jdbc-dbcp"0.3.2"]
官网:百度:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
c3p0与dbcp区别:
c3p0有自动回收空闲连接功能;dbcp没有自动回收空闲连接的功能;
c3p0提供最大空闲时间;dbcp提供最大连接数。
c3p0当超过最大空闲连接时间时,当前连接就会被断掉;dbcp当超过最大连接数时,所有连接都会被断开
com.jolbox.bonecp — 官网:BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。
oracle jdbc驱动:ojdbc7.jar,也可从下面url下载,我保存到 $HOME/repo 目录下除了oracle官网驱动外,也可以安装:[org.clojars.zentrope/ojdbc "11.2.0.3.0"]
二、创建一个project
$ lein new app jdbc-test; cd jdbc-test;lein pom
三、安装Oracle 驱动
参考文章:
第一种方法:安装官网驱动
插件,有两种安装方式,我采用的第二种方式
作为全局插件安装,vi ~/.lein/profiles.clj(windows 下编辑 %USERPROFILE%\.lein\profiles.clj)
{:user {:plugins [[lein-localrepo "0.5.3"]]}}
作为project插件安装,vi jdbc-test/project.clj:
:plugins [[lein-localrepo "0.5.3"]]
运行 lein deps
添加本地 repo ,执行
$ cd jdbc-test;
$ lein localrepo install $HOME/repo/ojdbc7-12.1.0.2.jar oracle.jdbc/oracledriver "12.1.0.2"
以下指令可以查看localrepo
$ lein localrepo list # lists all artifacts, all versions
$ lein localrepo list -s # lists all artifacts with description
$ lein localrepo list -f # lists all artifacts and filenames
$ lein localrepo list -d # lists all artifacts with detail
安装 ojdbc7驱动,
$ vi jdbc-test/project.clj,添加 [oracle.jdbc/oracledriver "12.1.0.2"]
$ lein deps
第二种方法:安装[org.clojars.zentrope/ojdbc "11.2.0.3.0"]
这种方式最简便,直接从clojars仓库就可以安装(本质上还是官网的驱动)
$ vi project.clj,添加依赖:[org.clojars.zentrope/ojdbc "11.2.0.3.0"]
$ lein deps
四、安装其他依赖软件:
修改 project.clj,添加依赖
$ vi project.clj
:dependencies [[org.clojure/clojure "1.6.0"]] 修改为
:dependencies [[org.clojure/clojure "1.6.0"]
[org.clojure/java.jdbc "0.3.7"]
;[com.mchange/c3p0 "0.9.5.1"]
[clojure.jdbc/clojure.jdbc-c3p0 "0.3.2"]
[oracle.jdbc/oracledriver "12.1.0.2"]
;[org.clojars.zentrope/ojdbc "11.2.0.3.0"]
[com.jolbox/bonecp "0.8.0.RELEASE"]]
$ lein deps
lein deps 会到如下网站进行搜素
手工可搜素如下网站
最终,软件会安装在如下目录
$HOME/.m2/repository/org/clojure/java.jdbc/0.3.7
$HOME/.m2/repository/clojure/jdbc/clojure.jdbc-c3p0/0.3.2/
$ lein classpath|tr ':' '\n' #查看下依赖路径
五、连接数据库
$ cd jdbc-test;vi src/jdbc_test/core.clj
(require'[clojure.java.jdbc :asjdbc])
(defdb {:classname"oracle.jdbc.OracleDriver" :subprotocol"oracle"
:subname"thin:@127.0.0.1:1521:SID"
:user"user"
:password"password"})
(println (jdbc/querydb ["select sysdate from dual"]))
$ lein run
六、复用数据库连接
参考文章:
我们不希望每次进行数据库操作都创建一个新的连接,因此需要对连接进行复用,有如下两种方案:使用 with-db-connection进行分组操作,这是一个宏,大致用法如下:
(nsdbexample
(:require[clojure.java.jdbc :asjdbc]))
(defdb-spec ...) (with-db-connection[db-con db-spec]
(let[;; fetch some rows using this connection
rows (jdbc/querydb-con ["SELECT * FROM table WHERE id = ?" 42])]
;; insert a copy of the first row using the same connection
(jdbc/insert!db-con :table(dissoc(firstrows) :id))))数据库连接池:使用C3P0或BoneCP等,见下一节
七、使用DBCP连接池
[clojure.jdbc/clojure.jdbc-dbcp "0.3.2"]
$ vi jdbc-test/core.clj
(require'[clojure.java.jdbc :asjdbc])
(require'[jdbc.pool.dbcp :aspool])
(defdb {:classname"oracle.jdbc.OracleDriver" :subprotocol"oracle"
:subname"thin:@127.0.0.1:1521:SID"
:user"user"
:password"password"})
(defdbspec (pool/make-datasource-specdb))
(println (jdbc/querydbspec ["select sysdate from dual"]))
八、使用C3P0连接池
参考:
需要软件
$ vi project.clj,添加依赖:
[clojure.jdbc/clojure.jdbc-c3p0 "0.3.2"]
[com.revelytix.logbacks/slf4j-log4j12 "1.0.0"]
第一种方式:
$ vi jdbc-test/core.clj
(require'[clojure.java.jdbc :asjdbc])
(require'[jdbc.pool.c3p0 :aspool])
(defdb {:classname"oracle.jdbc.OracleDriver" :subprotocol"oracle"
:subname"thin:@127.0.0.1:1521:SID"
:user"user"
:password"password"})
(defdbspec (pool/make-datasource-specdb))
(println (jdbc/querydbspec ["select sysdate from dual"]))
第二种方式:
$ vi jdbc-test/core.clj
(nsexample
(:useclojure.java.jdbc)
(:importjavax.sql.DataSource
com.mchange.v2.c3p0.DataSources))
(defdb {:datasource(DataSources/pooledDataSource(DataSources/unpooledDataSource"jdbc:oracle:thin:USER/PASS@HOST_IP:PORT:SCHEMA"))})
(println (jdbc/querydb ["select sysdate from dual"]))
九、使用BoneCP连接池
略...
十、常用jdbc操作
使用:(require'[honeysql.core :assql] '[honeysql.helpers :refer:all])
参考资料: