Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy中的Oracle SQL连接及其类_Sql_Oracle_Groovy - Fatal编程技术网

Groovy中的Oracle SQL连接及其类

Groovy中的Oracle SQL连接及其类,sql,oracle,groovy,Sql,Oracle,Groovy,我是Groovy新手,我有一个简单的类,它有一个“publicstaticvoidmain”,通过使用Groovy.SQL.SQL作为导入的SQL.execute和SQL.call语句执行SQL。我还导入了一个服务,用于检查Oracle数据库中现有应用程序中的安全设置。它还执行SQL语句。我的问题是,人们通常如何完成SQL连接?是否为每个类打开一个连接(即每个类中单独的SQL连接)?或者,您可以将SQL连接信息传递给该类并以某种方式使用相同的连接吗?现在我有两个独立的连接,虽然我不确定这是否是一

我是Groovy新手,我有一个简单的类,它有一个“publicstaticvoidmain”,通过使用Groovy.SQL.SQL作为导入的SQL.execute和SQL.call语句执行SQL。我还导入了一个服务,用于检查Oracle数据库中现有应用程序中的安全设置。它还执行SQL语句。我的问题是,人们通常如何完成SQL连接?是否为每个类打开一个连接(即每个类中单独的SQL连接)?或者,您可以将SQL连接信息传递给该类并以某种方式使用相同的连接吗?现在我有两个独立的连接,虽然我不确定这是否是一个好方法来完成这一点

如果上面的内容没有完全意义(因为我是新手),下面是我的代码示例。在我的主类中,我打开并调用SQL,如下所示:

//DB connection
def conn = new DbConnectService()           
def sql = Sql.newInstance(conn.url, conn.username, conn.password, conn.driver)
// Security check
def sec = new CheckSecurityService()
sec.SecurityCheck(ProgramName)
try 
{
        sql.call '{call G$_SECURITY.G$_VERIFY_PASSWORD1_PRD(?, ?, ?, ?)}', [$p_object, p_version, sql.VARCHAR, Sql.VARCHAR], { p_pass, p_rol ->
            p_password = p_pass
            p_role = p_rol
        } 
然后我想通过调用security check类来检查安全设置,如下所示:

//DB connection
def conn = new DbConnectService()           
def sql = Sql.newInstance(conn.url, conn.username, conn.password, conn.driver)
// Security check
def sec = new CheckSecurityService()
sec.SecurityCheck(ProgramName)
try 
{
        sql.call '{call G$_SECURITY.G$_VERIFY_PASSWORD1_PRD(?, ?, ?, ?)}', [$p_object, p_version, sql.VARCHAR, Sql.VARCHAR], { p_pass, p_rol ->
            p_password = p_pass
            p_role = p_rol
        } 
在打开与上述完全相同的DB连接后,安全检查会执行以下SQL调用:

//DB connection
def conn = new DbConnectService()           
def sql = Sql.newInstance(conn.url, conn.username, conn.password, conn.driver)
// Security check
def sec = new CheckSecurityService()
sec.SecurityCheck(ProgramName)
try 
{
        sql.call '{call G$_SECURITY.G$_VERIFY_PASSWORD1_PRD(?, ?, ?, ?)}', [$p_object, p_version, sql.VARCHAR, Sql.VARCHAR], { p_pass, p_rol ->
            p_password = p_pass
            p_role = p_rol
        } 
然后,如果成功,我将返回主类并执行更多sql语句,例如:

sql.execute("insert into test (key1, text) values (${foo}, ${text1})")

任何关于人们通常如何做这件事的信息都是非常感谢的!谢谢

正如您所说,您是在
main
线程中完成这一切的,我假设它是一个单线程应用程序。然后重用连接就可以了。理想情况下,在多线程应用程序中,您应该使用数据源和一些底层连接池,而不是直接在代码中打开和关闭连接

在这里,您可以将相同的
Sql
对象或
Connection
传递给安全检查器类,而不实际创建两个连接。即使创建两个连接,也没什么大不了的(除非在某个循环中这样做,或者面临性能问题)

一个建议是:对于insert,使用预先准备好的语句,比如语法,而不是字符串插值

sql.execute(“插入测试(key1,text)值(${foo},${text1})”)


sql.execute(“插入到测试(键1,文本)值(?,)”,[foo,text1])

Nobody?看起来这应该比我做的更容易,但我在搜索了很多次后找不到答案。对,绝对是单线程的。我担心出现错误时的回滚等问题。我已经研究了事务参数,它是否也适用于连接池,这样我就不用担心它了?根据你的建议,使用准备好的声明,你有什么理由这样做吗?谢谢对于单线程应用程序(除非运行的进程很长),我认为不需要连接池。事务在连接级别工作,池只返回一组池连接中的连接,而不是每次创建新连接,这不会影响事务${var}将使查询容易受到sql注入和其他语法问题的攻击,准备好的语句可以避免这种麻烦。有没有一种方法可以在不将sql连接信息传递给我从另一个服务调用的每个方法的情况下重用连接?似乎应该有更好的方法。在构造函数中接受连接并在实例化时传递它。类的方法可以将其用作实例变量。谢谢kunal!我必须研究其中的一些条款,但我能够实现它。:)