【问题标题】:Clojure / SQLServer: How to Call Stored Procedure with C3P0 Connection PoolClojure / SQLServer:如何使用 C3P0 连接池调用存储过程
【发布时间】:2013-07-02 23:03:36
【问题描述】:

按照这个例子

https://github.com/clojure/java.jdbc/blob/master/doc/clojure/java/jdbc/ConnectionPooling.md

关于 jdbc 连接池,我在 Clojure 应用程序中设置了一个到 SQLServer 的连接池,如下所示

;; Database Connection Handling.
(ns myapp.db
    (:import [com.mchange.v2.c3p0 ComboPooledDataSource]))

;; ### specification
;; Defines the database connection parameters.
(def specification {
    :classname "com.microsoft.sqlserver.jdbc.SQLServerDriver"
    :subprotocol "sqlserver"
    :subname "//some;info;here"
})

;; ### pooled-data-source
;; Creates a database connection pool using the
;; <a href="https://github.com/swaldman/c3p0">c3p0</a> JDBC
;; connection pooling library.
(defn pooled-data-source [specification]
    (let [datasource (ComboPooledDataSource.)]
        (.setDriverClass datasource (:classname specification))
        (.setJdbcUrl datasource (str "jdbc:" (:subprotocol specification) ":" (:subname specification)))
        (.setUser datasource (:user specification))
        (.setPassword datasource (:password specification))
        (.setMaxIdleTimeExcessConnections datasource (* 30 60))
        (.setMaxIdleTime datasource (* 3 60 60))
        {:datasource datasource}))

;; ### connection-pool
;; Creates the connection pool when first called.
(def connection-pool
    (delay
        (pooled-data-source specification)))

;; ### connection
;; Get a connection from the connection pool.
(defn connection [] @connection-pool)

我知道如何使用连接来进行选择和插入语句等,我的问题是我将如何使用它来调用存储过程并收集输出,这些输出可能是各种形状和大小的记录?

;; ### Definitions of queries.
(ns myapp.query
     (:require [myapp.db]))

;; HOW DO I CALL THIS PROC THROUGH A POOLED CONNECTION?
(defn call-the-stored-proc []
    (str "{ call someStoredProcForMyApp("...")}"))

【问题讨论】:

    标签: sql-server clojure c3p0


    【解决方案1】:

    对于不需要OUT参数的基本存储过程,可以使用db-do-prepared

    (require '[clojure.java.jdbc :as j])
    (j/db-do-prepared (connection) "EXEC YourStoredProc ?" [COLUMN_NAME])
    

    它会调用您的 connection 函数,这与文档中所说的调用函数相同。

    我已经开始致力于为 JDBC 添加完整的可调用语句支持,但我还没有时间完成这项工作。这是 Clojue 的 JIRA 中的问题 JDBC-48,我的进度是 is in the sprocs branch of my fork

    【讨论】:

    • 感谢 Jeremy,我没有尝试过 EXEC,但我尝试过“{call myProc(params)}”。我确实需要编写自己的例程来收集多个结果集,并已写信给 clojure.java.jdbc 的作者关于支持多个结果集返回。
    • 是的,call 不会工作,除非你使用 CallableStatement,这是我正在为 java.jdbc 实现的。我可能很快会重新审视这个问题,因为我确信在某些时候我真的需要这个工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2011-06-11
    • 1970-01-01
    • 2019-12-31
    • 2013-12-29
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多