参考文章:https://en.wikibooks.org/wiki/Clojure_Programming/Examples/JDBC_Examples#Oracle

逆旅过客:http://blog.chinaunix.net/uid/298861.html

 

本文介绍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

依赖软件:

百度:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目Hibernate,Spring等。

c3p0与dbcp区别:

c3p0有自动回收空闲连接功能;dbcp没有自动回收空闲连接的功能;

c3p0提供最大空闲时间;dbcp提供最大连接数。

c3p0当超过最大空闲连接时间时,当前连接就会被断掉;dbcp当超过最大连接数时,所有连接都会被断开

 

BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4jguava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。

 

  • oracle jdbc驱动:ojdbc7.jar,也可从下面url下载,我保存到 $HOME/repo 目录下

http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

安装此驱动需要lein-localrepo 插件:https://github.com/kumarshantanu/lein-localrepo

 

  • 除了oracle官网驱动外,也可以安装:[org.clojars.zentrope/ojdbc "11.2.0.3.0"]

     

二、创建一个project

    $ lein new app jdbc-test; cd jdbc-test;lein pom

 

三、安装Oracle 驱动

参考文章:http://stackoverflow.com/questions/18249901/clojure-lein-cant-find-oracle-jdbc-driver

 

第一种方法:安装官网驱动

 

  1. 首先安装lein-localrepo 插件,有两种安装方式,我采用的第二种方式

     

    1. 作为全局插件安装,vi ~/.lein/profiles.clj (windows 下编辑 %USERPROFILE%\.lein\profiles.clj)

    {:user {:plugins [[lein-localrepo "0.5.3"]]}}

     

    1. 作为project插件安装vi jdbc-test/project.clj

        :plugins [[lein-localrepo "0.5.3"]]

    运行 lein deps

     

  2. 添加本地 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

 

  1. 安装 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 会到如下网站进行搜素

https://repo1.maven.org/maven2/

https://clojars.org/repo/

 

手工可搜素如下网站

http://search.maven.org

https://clojars.org/

 

最终,软件会安装在如下目录

$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 :as jdbc])

(def db {:classname "
oracle.jdbc.OracleDriver"
:subprotocol "oracle"
:subname "thin:@127.0.0.1:1521:SID"
:user "user"
:password "password"})

(println (jdbc/query db ["select sysdate from dual"]))

 

$ lein run

 

六、复用数据库连接

参考文章:http://clojure-doc.org/articles/ecosystem/java_jdbc/home.html

 

我们不希望每次进行数据库操作都创建一个新的连接,因此需要对连接进行复用,有如下两种方案:

  1. 使用 with-db-connection 进行分组操作,这是一个宏,大致用法如下:

(ns dbexample
(:require [clojure.java.jdbc :as jdbc]))

(def db-spec ...)
(with-db-connection [db-con db-spec]
(let [;; fetch some rows using this connection
rows (jdbc/query db-con ["SELECT * FROM table WHERE id = ?" 42])]
;; insert a copy of the first row using the same connection
(jdbc/insert! db-con :table (dissoc (first rows) :id))))

  1. 数据库连接池:使用C3P0或BoneCP等,见下一节

     

七、使用DBCP连接池

参考:https://github.com/niwinz/clojure.jdbc-dbcp

$ vi project.clj,添加依赖:

[clojure.jdbc/clojure.jdbc-dbcp "0.3.2"]

 

$ vi jdbc-test/core.clj

(require '[clojure.java.jdbc :as jdbc])
(require '[jdbc.pool.dbcp :as pool])

 

(def db {:classname   "oracle.jdbc.OracleDriver"  
:subprotocol "oracle"
:subname "thin:@127.0.0.1:1521:SID"
:user "user"
:password "password"})

(def dbspec (pool/make-datasource-spec db))

 

(println (jdbc/query dbspec ["select sysdate from dual"]))

 

 

八、使用C3P0连接池

参考:http://clojure-doc.org/articles/ecosystem/java_jdbc/connection_pooling.html

 

需要软件

C3P0: https://github.com/samphilipd/clojure.jdbc-c3p0

SLF4J:http://www.slf4j.org/download.html,version:1.7.12,用于日志记录,我们使用clojars.org网站提供的封装

 

$ 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 :as jdbc])
(require '[jdbc.pool.c3p0 :as pool])

 

(def db {:classname   "oracle.jdbc.OracleDriver"  
:subprotocol "oracle"
:subname "thin:@127.0.0.1:1521:SID"
:user "user"
:password "password"})

(def dbspec (pool/make-datasource-spec db))

 

(println (jdbc/query dbspec ["select sysdate from dual"]))

第二种方式:

$ vi jdbc-test/core.clj

(ns example
(:use clojure.java.jdbc)
(:import javax.sql.DataSource
com.mchange.v2.c3p0.DataSources))

(def db {:datasource (DataSources/pooledDataSource
(DataSources/unpooledDataSource "jdbc:oracle:thin:USER/PASS@HOST_IP:PORT:SCHEMA"))})

(println (jdbc/query db ["select sysdate from dual"]))

 

 

九、使用BoneCP连接池

略...

十、常用jdbc操作

java.jdbc API Reference http://clojure.github.io/java.jdbc/#clojure.java.jdbc/create-table-ddl

  1. DDl

    create-table-ddl

    drop-table-ddl

    do-command

    execute!

  2. DML

十一、HoneySQL

官网:https://github.com/jkk/honeysql

安装:[honeysql "0.6.1"]

使用:(require '[honeysql.core :as sql] '[honeysql.helpers :refer
												:all])
					

 

参考资料:

Leiningen教程中文版 http://wiki.fnil.net/index.php?title=Leiningen_tutorial%E4%B8%AD%E6%96%87%E7%89%88

 

09-20 00:48