1、在客户端软件开发中使用thin驱动程序
在开发java软件方面,oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择oci驱动程序或thin驱动程序。oci驱动程序利用java本地化接口(jni),通过oracle客户端软件与数据库进行通讯。thin驱动程序是纯java驱动程序,它直接与数据库进行通讯。为了获得最高的性能,oracle建议在客户端软件的开发中使用oci驱动程序,这似乎是正确的。但我建议使用thin驱动程序,因为通过多次测试发现,在通常情况下,thin驱动程序的性能都超过了oci驱动程序。
2、关闭自动提交功能,提高系统性能
在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的connection类的setautocommit()方法关闭自动提交功能,如下所示:
conn.setautocommit(false)
值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用connection类的commit()和rollback()方法来人工的方式对事务进行管理。
3、在动态sql或有时间限制的命令中使用statement对象
在执行sql命令时,我们有二种选择:可以使用preparedstatement对象,也可以使用statement对象歼槐。无论多少次地使用同一个sql命令,preparedstatement都只对它解析和编译一次。当使用statement对象时,每次执行一个sql命令时,都会对它进行解析和编译。这可能会使你认为,使用preparedstatement对象比使用statement对象的速度更快。然而,我进行的测试表明,在客户端软件中,情况并非如此。因此,在有时间限制的sql *** 作中,除非成批地处理sql命令,我们应当考虑使用statement对象。
此外,使用statement对象也使得编写动态sql命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的sql命令。因此,我认为,statement对象可以使动态sql命令的创建和执行变得更加简单。
4、利用helper函数对动态sql命令进行格式化
在创建使用statement对象执行的动态sql命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字o'reilly插入表中的sql命令,则必须使用二个相连的“''”号替换o'reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换 *** 作的helper方法,然后在连接字符串心服用公式表达一个sql命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个date型的值,然后让它输出基于oracle的to_date()函数的字符串表达式。
5、利用preparedstatement对象提高数据库的总体效率
在使用preparedstatement对象执行sql命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个preparedstatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的sql命令,使用preparedstatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行preparedstatement任务需要的时间长于statement任务,我会建议在除动态sql命令之外的所有情况下使用preparedstatement对象。
6、在成批处理重复的插入或更新 *** 作中使用preparedstatement对象
如果成批地处理插入和更新 *** 作,就能够显著地减少它们所需要的时间。oracle提供的statement和 callablestatement并不真正地支持批处理,只有preparedstatement对象才真正地支持批处理。我们可以使用addbatch()和executebatch()方法选择标准的jdbc批处理,或者通过利用preparedstatement对象的setexecutebatch()方法和标准的executeupdate()方法选择速度更快的oracle专有的方法。要使用oracle专有的批处理机制,可以以如下所示的方式调用setexecutebatch():
preparedstatement pstmt3d null
try {
((oraclepreparedstatement)
pstmt).setexecutebatch(30)
...
pstmt.executeupdate()
}
调用setexecutebatch()时指定的值是一个上限,当达到该值时,就会自动地引发sql命令执行,标准的executeupdate()方法就会被作为批处理送到数据库中。我们可以通过调用preparedstatement类的sendbatch()方法随时传输批处理任务。
7、使用oracle locator方法插入、更新大对象(lob)
oracle的preparedstatement类不完全支持blob和clob等大对象的处理,尤其是thin驱动程序不支持利用preparedstatement对象的setobject()和setbinarystream()方法设置blob的值,也不支持利用setcharacterstream()方法设置clob的值。只有locator本身中的方法才能够从数据库中获取lob类型的值。可以使用preparedstatement对象插入或更新lob,但需要使用locator才能获取lob的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取lob的值。
8、使用sql92语法调用存储过程
在调用存储过程时,我们可以使用sql92或oracle pl/sql,由于使用oracle pl/sql并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用sql92。
9、使用object sql将对象模式转移到数据库中
既然可以将oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在java中没有什么问题,但由于 *** 作都是在数据库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和 *** 作,然后使用jpublisher等工具生成自己的java bean类。如果使用这种方式,不但java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和 *** 作的应用软件也可以使用应用软件中的对象模式。
这篇文章主要介绍如何使链氏碰用jdbc配置连接数据库(oracle的RAC配置的数据库)达到负载均衡的情况 该例子是以 个NODE的情况说明 希望对大家有所帮助
我的问题是我需要设置oracle x的thin客户端连接到oracle的RAC环境上
注:这样连接可以通过RAC自动平衡负载
原文如下:
Hi Tom
I couldn t find this information easily on the net So I m submitting it hereand hope you make it available for anyone else looking for this information
My problem was I needed to configure the Oracle x thin driver (type IV) toconnect to an Oracle Real Application Cluster (RAC) environment
For example assuming you have a database called RAC_DB with o nodes node and node
You would need to configure your tnsnames ora with the following information inthe following way:
RAC_DB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = node )(PORT = )) (ADDRESS = (PROTOCOL = TCP)(HOST = node )(PORT = )) (LOAD_BALANCE = yes) (FAILOVER = on) ) (CONNECT_DATA = (SERVICE_NAME = RAC_DB) (FAILOVER_MODE = (TYPE = SELECT) 核睁 (METHOD = BASIC) 棚谈 (RETRIES = ) (DELAY = ) ) ) )
Now if you start a SQL*PLUS session then you should see a connection on thenode instance If you start another SQL*PLUS session then Oracle shouldconnect you to the node instance (automatic load balancing) It s actuallypretty cool to see the first time
To pass this same information to the Oracle s JDBC thin driver you essentiallyconcatenate a shorten version of the tnsnames information above and pass this tothe driver
String userid = scott String password = tiger
String tnsnames_info = (DESCRIPTION=(ADDRESS_LIST= + (ADDRESS=(PROTOCOL=TCP)(HOST=node )(PORT= )) + (ADDRESS=(PROTOCOL=TCP)(HOST=node )(PORT= )) + (LOAD_BALANCE=yes)(FAILOVER=on)) + (CONNECT_DATA=(SERVICE_NAME=rac_db)))
String url = jdbc:oracle:thin:@ + tnsnames_info
DriverManager registerDriver(new oracle jdbc OracleDriver()) Connection dbConnection = DriverManager getConnection(url userid password)
That s it If your application creates multiple connection to the database then you should see these connections load balance across the o instances
One last note Oracle only supports connection to a RAC configuration with the i drivers so you should try to get the latest Oracle JDBC thin driver
HTH Peter
and we said
you made it really hard you just needed the service! the load balancing andall could be/should be setup on the listener side!
you have one listener both databases register with it as a service
that would be another option
Reviews
I think we tried that and it didn t work September Reviewer: Peter Tran from Houston TX USA
Hi Tom
I m pretty sure we tried that but it didn t work with the thin driver Thatapproach will work if you use the OCI driver but not with the thin driver
Please send me an example of what you mean or what files I should configure totest it out
I m always opened to easier options
Thanks Peter
Followup:you need to set up mts and a single listener thats it
pmon on each of the rac instances will tell the listener about the load and awayit goes you might not see the round robin right off (both are not yetloaded ) so it ll be an unbalanced load balance initially but as the systemramps it ll balance out
Unknown territory September Reviewer: Peter Tran from Houston TX USA
I m sorry but I really lost you with that last remendation Rather thanfrustrate you with my ignorance can you remend the Oracle documentation thatI should read to brush up on this information?
I ll read this first and e back with questions if I m still lost
For example I don t understand why you want me to setup the database as MTS Why can t I use dedicated server mode?
Thanks for the quick response
Peter
Followup:in order for a single listener to service many instances on differentmachines the listener must be servicing shared server connections thelistener cannot fork/exec a dedicated server since the listener may well notbe running on the machine the instance is on it needs to know dispatcheraddresses to redirect the client request to
lishixinzhi/Article/program/Oracle/201311/17131
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)