; java数据库连接(jdbc)api是一系列能够让java编程人员访问数据库的接口,各个开发商的接口并不完全相同。在使用多年的oracle公司的jdbc后,我积累了许多技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能。
1、在客户端软件开发中使用thin驱动程序
在开发java软件方面,oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择oci驱动程序或thin驱动程序。oci驱动程序利用java本地化接口(jni),通过oracle客户端软件与数据库进行通讯。thin驱动程序是纯java驱动程序,它直接与数据库进行通讯。为了获得最高的性能,oracle建议在客户端软件的开发中使用oci驱动程序,这似乎是正确的。但我建议使用thin驱动程序,因为通过多次测试发现,在通常情况下,thin驱动程序的性能都超过了oci驱动程序。
2、关闭自动提交功能,提高系统性能
在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的connection类的setautocommit()方法关闭自动提交功能,如下所示:
connsetautocommit(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);pstmtexecuteupdate();}
调用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应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和 *** 作的应用软件也可以使用应用软件中的对象模式。
10、利用sql完成数据库内的 *** 作
我要向大家介绍的最重要的经验是充分利用sql的面向集合的方法来解决数据库处理需求,而不是使用java等过程化的编程语言。
如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的update命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个update命令中完成。当能够在单一的sql命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥sql的功能
有感于网上查到了大量相当有帮助的技术性文章,这里也把我前段时间实现的一个功能程序公布出来,供需者参考。
功能简介:服务器R(remote)只负责网站的运行和访问,每天获得一批新的原始数据,服务器L(local)负责后台运算,自动定时从服务器R的mysql里读取数据,在L上经过matlab编写的算法程序运算后再远程将结果写回R的数据库以实现网站的更新。全程无人值守。(L负责后台运算,安装matlab;R负责网络访问,安装mysql)
不同于网络上查到的实现方法,本程序全部在m文件里编写,不用php 或c++做接口,宗旨就是用简单的方法实现简单的想法。(以下假定suanfam子程序已经存在)
1编写import_datam子程序,实现从mysql读取数据到matlab中
1)下载mysql的jdbc的java驱动,安装到:\Program Files\MATLAB71\java\jar\toolbox路径下;
2)此“路径\文件名”添到:\Program Files\MATLAB71\toolbox\local下的classpathtxt文件中;
3)设置mysql下的数据库名称为带有“mysql ”后缀的,比如:abcmysql;
4)服务器R的mysql下,输入“grant all on to username@"L的IP" Identified by
"password",允许L远程访问;
5)复制如下代码到import_data文件中
function MM=import_data();
timeoutA=logintimeout(5)
% Set maximum time allowed for establishing a connection
connA = database('mysql', 'username', 'password','commysqljdbcDriver','jdbc:mysql:
//R的IP:3306/abc')
ping(connA) % Check the database status
cursorA=exec(connA,'SELECT ALL CONLUMA,CONLUMB,CONLUMC FROM tablename);
setdbprefs('DataReturnFormat','numeric'); %set numeric format
cursorA=fetch(cursorA) ; % Fetch all rows of data
MM=cursorAData; % Display the data,save the data in MM
close(cursorA) ; % Close the cursor and the connection
close(connA)
其中username,password,L\R的IP,数据库名称abc,tablename,sql语句都是要依实际修改的。
2编写export_datam子程序,实现从matlab写回数据到mysql中:
原理类似, (tablename2的表要事先建好u)复制以下程序:
timeoutA=logintimeout(5)
% Set maximum time allowed for establishing a connection
connA = database('mysql', 'username', 'password','commysqljdbcDriver','jdbc:mysql:
//R的IP:3306/abc')
ping(connA) % Check the database status
%delete the records before updating
cursorA=exec(connA,'delete tablename FROM tablename');
Colnames = ;%updating
fastinsert(connA, 'tablename2', Colnames,newdata);
close(cursorA) ;
close(connA);
其中username,password,R的IP,数据库名称abc,tablename,sql语句都是要以实际情况修改的,
newdata就是suanfam程序得到结果组成的矩阵,这些结果将写到数据库中tablename2的表中。
3编写主程序以调用这些子程序:
4编译m程序为exe程序:
(注意主程序头部的也要加“function”呦,否则作为脚本文件不能编译)
1)在matlab环境中配置编译器,输入mbuild -setup,依提示 *** 作;
2)输入mcc -m mainm suanfam import_datam export_datam生成与主程序同名的exe文件;
3)设置windows任务计划,添加此exe文件便可以自动定时读取、计算、更新网站数据库了。
ps:matlab70没有找到deploytool工具,没法连接数据库,要使用更高版本的matlab。
Database Toolbox 2
和关系数据库进行数据交换
Database 工具箱可以使你使用MATLAB 的数据分析
和可视化工具对存储在数据库中的数据进行分析。在
MATLAB 工作环境中, 您可以使用结构化查询语言进
行:
■ 对数据库中的数据进行读写
■ 使用约束条件对数据库进行 *** 作
您可以在MATLAB 中和绝大多数的数据库进行交
互, 包括Oracle、Sybase、Microsoft SQL Server、
MySQL、PostgreSQL 以及Microsoft Access 。该工具箱
还允许您在单个的MATLAB 任务中同时存取多个数据
库并且支持事务特性。它包含了Visual Query Builder
( 可视化查询工具), 它可以使您在不熟悉SQL 的情
况下和数据库进行交互。
Visual Query Builder
可以快速对您的数据
进行存取和图表显示
关键特性
■ 支持ODBC/JDBC 连接的数据库接口
包括Oracle、Sybase、Microsoft SQL
Server、MySQL、PostgreSQL 以及
Microsoft Access
■ 从MATLAB 中直接执行查询语句
■ 对于大数据量查询, 将增量获取数据
■ 在所有的数据导入和导出的过程中,
保留数据类型
■ 单个的MATLAB 任务中可以同时
存取多个数据库
■ 从一个数据库中导入数据,完成计
算后, 将结果输出到另外一个数据库
■ 在单个事务中获取大数据集, 或者分
割数据, 通过多个事务来完成
■ 通过在一个MATLAB 会话中保持数
据库连接来减少需要进行输入和输出
数据所需要的语句, 除非数据库连接
被显式关闭
■ 它可以使您在不熟悉SQL 的情况下
和数据库进行交互
在MATLAB 中对Microsoft Access 数据库进行查询
数据库工具箱函数列表
数据库访问函数
clearwarnings 清除数据库连接警告
close 关闭数据库连接
commit 数据库改变参数
database 连接数据库
exec 执行SQL语句和打开油标
get 得到数据库属性
insert 导出MATLAB单元数组数据到数据库表
isconnection 判断数据库连接是否有效
isreadonly 判断数据库连接是否只读
ping 得到数据库连接信息
rollback 撤销数据库变化
set 设置数据库连接属性
sql2native 转换JDBC SQL 语法为系统本身的SQL语法
update 用MATLAB单元数组数据代替数据库表的数据
数据库游标访问函数
attr 获得的数据集的列属性
close 关闭游标
cols 获得的数据集的列数值
columnnames 获得的数据集的列名称
fetch 导入数据到MATLAB单元数组
get 得到游标对象属性
querytimeout 数据库SQL查询成功的时间
rows 获取数据集的行数
set 设置游标获取的行限制
width 获取数据集的列宽
数据库元数据函数
bestrowid 得到数据库表唯一行标识
columnprivileges 得到数据库列优先权
columns 得到数据库表列名称
crossreference 得到主健和外健信息
dmd 创建数据库元数据对象
exportedkeys 得到导出外部健信息
get 得到数据库元数据属性
importedkeys 得到导入外健信息
indexinfo 得到数据库表的索引和统计
primarykeys 从数据库表或结构得到主健信息
procedurecolumns 得到目录存储程序参数和结果列
procedures 得到目录存储程序
supports 判断是否支持数据库元数据
tableprivileges 得到数据库表优先权
tables 得到数据库表名称
versioncolumns 得到自动更新表列
--------------------------------------------------------------------------------
Xinsoft,2004-08-11 20:28:15
数据库工具箱让用户使用MATLAB强大数据分析和可视化工具功能处理存储在数据库中的数据的复杂分析。在MATLAB环境下工作,可以用结构化查询语言SQL)命令:
读,写数据库的数据
简单和高级条件的数据查询
连接MATLAB和数据库包括Oracle,Sybase,Microsoft SQL Server和Informix。
可以用单一MATLAB同时访问多个数据库,进行大数据量的事务处理。不懂SQL的用户可以用Visual Query Builder处理数据。
重点
鲁棒接口能力。 用ODBC/JDBC连接数据库,包括Oracle,Sybase SQL Server,Sybase SQL Anywhere,Microsoft SQL Server, Microsoft Access,
Informix Ingres
SQL语法。 在MATLAB环境直接执行SQL查询
动态导入数据。 调节SQL查询,把数据导入MATLAB。数据库工具箱满足小的和大的查询。
数据类型保存。 在数据导入和导出行为MATLAB保存数据类型
同时访问多个数据库。 从数据库导入数据,对该数据执行计算,然后导入到另一个数据库。
处理大数据集的能力。
连续状态的数据库连接:一旦和某个数据库的连接建立后,数据库一直是打开的,除非在MATLAB中执行关闭语句。这提高了数据库的读取速度,减少了不必要的命令来调入,输出数据 Visual Query Builder 该图形用户接口列数据源和所有表和字段,不懂SQL的用户可以访问和查询数据库函数列表
数据库访问函数
clearwarnings 清除数据库连接警告
close 关闭数据库连接
commit 数据库改变参数
database 连接数据库
exec 执行SQL语句和打开油标
get 得到数据库属性
insert 导出MATLAB单元数组数据到数据库表
isconnection 判断数据库连接是否有效
isreadonly 判断数据库连接是否只读
ping 得到数据库连接信息
rollback 撤销数据库变化
set 设置数据库连接属性
sql2native 转换JDBC SQL 语法为系统本身的SQL语法
update 用MATLAB单元数组数据代替数据库表的数据
数据库游标访问函数
attr 获得的数据集的列属性
close 关闭游标
cols 获得的数据集的列数值
columnnames 获得的数据集的列名称
fetch 导入数据到MATLAB单元数组
get 得到游标对象属性
querytimeout 数据库SQL查询成功的时间
rows 获取数据集的行数
set 设置游标获取的行限制
width 获取数据集的列宽
数据库元数据函数
bestrowid 得到数据库表唯一行标识
columnprivileges 得到数据库列优先权
columns 得到数据库表列名称
crossreference 得到主健和外健信息
dmd 创建数据库元数据对象
exportedkeys 得到导出外部健信息
get 得到数据库元数据属性
importedkeys 得到导入外健信息
indexinfo 得到数据库表的索引和统计
primarykeys 从数据库表或结构得到主健信息
procedurecolumns 得到目录存储程序参数和结果列
procedures 得到目录存储程序
supports 判断是否支持数据库元数据
tableprivileges 得到数据库表优先权
tables 得到数据库表名称
versioncolumns 得到自动更新表列
MATLABER曰:
这是个很经典的介绍,
因为它涉及到MATLAB在金融学中的应用,甚至利用它可以作出很好的财务软件
zhimingchen曰:Visual Query Builder 不支持汉字,所以我觉得使用 Visual Query Builder 不是最好的方法;使用DAO,特别ADO是一种很好方法,可以做到与数据库无关;请看我的一个访问数据库的实例:
function Table=GetTable(ConnectionStr,SqlStr)
%ConnectionStr为连接串,比如可以设置ConnectionStr='Data Source=HistryData20;
Pr
ovider=MSDASQL;User ID=Admin;Password=;'
%SqlStr为SQL语句,
% 利用ADO调用数据源
try
MyConnection=actxserver('ADODBConnection');
MyConnectionConnectionString=ConnectionStr;
invoke(MyConnection,'Open');
MyRecordset=invoke(MyConnection,'Execute',SqlStr);
%域信息
Fields=MyRecordsetFields;
%域个数
FieldNumber=FieldsCount;
FieldNames=cell(1,FieldNumber);
%获取数据
% invoke(MyRecordset,'MoveFirst');
Data=invoke(MyRecordset,'GetRows');
MyRecordsetSource;
%记录行数
RecordCount=size(Data,2);
for i=1:size(FieldNames,2)
TempField=get(Fields,'Item',i-1);
FieldNames=TempFieldName;
end
%给Table赋植
TableRecordCount=RecordCount;
TableFieldNames=FieldNames;
TableData=Data;
invoke(MyRecordset,'Close');
invoke(MyConnection,'Close');
catch
msgbox(lasterr,'Tint');
TableData={};
end
--------------------------------------------------------------------------------
Xinsoft,2004-08-11 20:28:37
一、通过MATLAB 提供的数据库引擎, 以下是MATLAB ,DATABASE TOOLBOX中的例子,
通过ODBC/JDBC 接口访问具体的数据库
function dbimportdemo()
%DBIMPORTDEMO Imports data into Matlab from a database
% Version 10 21-Oct-1997
% Author(s): EF McGoldrick, 12/5/1997
% Copyright (c) 1984-2001 The MathWorks, Inc
% $Revision: 17 $ $Date: 2001/01/12 16:22:06 $
% Set maximum time allowed for establishing a connection
timeoutA=logintimeout(5)
% Connect to a database
%打开数据源 SampleDB
connA=database('SampleDB','','')
% Check the database status
ping(connA)
% Open cursor and execute SQL statement
%执行SQL查询语句
cursorA=exec(connA,'select country from customers');
% Fetch the first 10 rows of data
%获取前十行数据
cursorA=fetch(cursorA,10)
% Display the data
%显示
AA=cursorAData
% Close the cursor and the connection
%关闭
close(cursorA)
close(connA)
二、通过DAO访问数据库(DAO技术适合于访问ACCESS 2000以下版本的数据库,优点是功
能
齐全,具体可以参考MSDN关于DAO的帮助),以下是我自己摸索出来的,在MATLAB帮助文
件
中有关于如何调用EXCEL组件的方法。
Handle=actxserver('DAODBEngine36');
MyWSS=get(Handle,'Workspaces')
Count=get(MyWSS,'Count')
MyWS=get(MyWSS,'Item',0)
%打开数据库
MyDB=invoke(MyWS,'OpenDatabase','D:\My Documents\testmdb')
%打开数据库的表,得到一个指向记录集的指针
MyRS=invoke(MyDB,'OpenRecordset','用户')
%获取“用户”表的前十行数据
MyRows=invoke(MyRS,'GetRows','10')
%关闭
invoke(MyRS,'Close')
invoke(MyDB,'Close')
invoke(MyWS,'Close')
三、ADO技术(微软建议ACCESS 2000及以上版本的数据库应尽量通过ADO访问,优点是可
以
通过较少的对象访问数据库,ADO与今后微软的数据库技术发展方向一致,目前支持的功
能
稍微少了一些)具体访问的可以参考MSDN的帮助文件和ADO 类型库的方法原型。
四、通过dde进行动态数据交换,可以查看help
这是我帮你找来的。不知道对不对。找了很久的!
1、升级硬件
2、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。
3、扩大服务器的内存
4、增加服务器CPU个数
5、对于大的数据库不要设置数据库自动增长,它会降低服务器的性能
6、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
7、查询时不要返回不需要的行、列
8、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制 *** 作的行
9、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数
10、一般在GROUP BY 个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:
select的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By 个Having的开销小,查询快对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快
11、一次更新多条记录比分多次更新每次一条快,就是说批处理好
一般用mybatis都是用数据库连接池c3p0等,连接池是在服务器启动的时候先创建一些连接,用的时候直接从连接池中取出来用,用完了,返回给连接。连接不会关闭,一直开着,这样能减少新建连接,连接关闭带来的资源消耗
以上就是关于JDBC连接Oracle数据库之十大技巧全部的内容,包括:JDBC连接Oracle数据库之十大技巧、Matlab和Mysql数据连接问题。、如何加快数据库连接速度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)