Tag Archives: Java

Oracle中的Java调用

项目中碰到一个特殊情况,部分功能必须通过Java实现,记录一下在Oracle中调用Java的方法。 实时使用的时候要慎重考虑,是否需要这么复杂的方案。 方法一:在PL/SQL中直接写java源代码,适合简单功能的测试,毕竟在PL/SQL中写Java代码还是很麻烦的。 将java的功能封装成一个函数 调用函数 在user_objects可以查询到创建的java程序、编译后的CLASS 方法二:将java的class文件或jar包导入到数据库中 剩下的步骤同方法一

解决Enovia在WAS 8.0运行缓慢的问题小计

Enovia在Tomcat环境下运行正常,但部署到WAS后每个页面打开都很慢,主jsp文件打开都在3-4秒,即使是很简单的页面也是如此,非常奇怪的问题。 刚开始是怀疑是WAS中JVM参数的问题,但修改了内存相关的参数无效。考虑到我们在系统空闲的时候2个人测试,页面打开依然慢,想来也不是在内存方面存在瓶颈。 没办法,再次想到了Profiler工具。这次依然使用了Yourkit Java Profiler,经过观察找到了下图的一个疑点: 产生一个XSLTransformer对象居然要花费了10%的时间,按照这个关键词搜索,在IBM网站上找到了一个非常相像的案例: XSLT transformations cause high CPU and slow performance 大意是IBM认为产生XSLT transformations对象的模板类应该是”一次产生,多次复用“的,因此对产生的对象进行了优化,结果就是模板类产生慢,但后期运行的时候速度快。不幸的是有些应用程序开发的时候没有按照IBM的原则,每次都重新生成一个模板类,造成性能问题。这个文章中有两个解决思路: 1、修改程序,指定产生XSLT transformations对象使用的工厂类。 2、增加JVM运行参数 -Djavax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl 因为Enovia为购买产品,无法修改源代码,只能按照第二种方法进行测试。 在Apache网站下载了xalanjar包,放到ecnovia的war包的WEB-INF/lib路径下,修改jvm参数并重启后,页面打开的速度得到了很大提升,主jsp文件打开速度下降到1秒多一点,比Tomcat的运行速度还要快一点,至此问题圆满解决。

oracle数组接口性能测试

测试场景和结果: 向没有索引的表中插入20万条数据 PL/SQL测试结果:插入20万条记录,花费时间500ms左右 Jdbc批量操作(每50条一个batch)测试结果:插入20万条记录,花费时间1200ms左右。 表结构如下: CREATE TABLE INSERT_TEST( F1 NUMBER, F2 VARCHAR2(10), F3 VARCHAR2(10), F4 VARCHAR2(10), F5 VARCHAR2(10), F6 NUMBER, F7 NUMBER, F8 NUMBER, F9 NUMBER, F10 NUMBER ) 测试环境: AMD Athlon(tm) II X2 240 Processor 2G内存 单块7200rpm SATA硬盘 Linux 2.6.31-14-generic i686 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – Prod SYS@orcl>show parameter log_buffer NAME    [...]

使用jdbc时缓存PreparedStatement的简单测试

一、测试方案简单说明 1、无连接池 Class.forName(driverClass); conn = DriverManager.getConnection(jdbcUrl, user, password); 2、无连接池,使用oracle专有的缓存机制 ((oracle.jdbc.OracleConnection) conn).setImplicitCachingEnabled(true);((oracle.jdbc.OracleConnection) conn).setStatementCacheSize(10); 3、使用DBCP连接池,无缓存 4、使用DBCP连接池,带缓存 poolPreparedStatements=false maxOpenPreparedStatements=10 5:使用C3P0连接池,无缓存 6、使用C3P0连接池,带缓存 maxStatementsPerConnection=10 二、oracle中检查解析次数方法(测试期间数据库没有其他访问用户): select name, value from v$sysstatwhere name like ‘%parse%’; 三、测试结果: parse count (total) delta parse count test scenario excute time 63738 64043 296 DBCP without cached prepared statement 2110 64305 253 DBCP cached prepared statement 1547 [...]

oracle中row prefetch测试

效果总结:row prefetch一方面可以减少网络传输次数,降低响应时间,另一方面oracle可以把多个单块读转变合并为一次多块读,减少逻辑读的次数。 一、sqlplus的测试 说明:sqlplus默认arraysize=2 SYS@orcl>create table t1(id number(*,0)); SYS@orcl>begin 2 for i in 1..1000 loop 3 insert into t1 values(i); 4 end loop; 5 end; / SYS@orcl>set autotrace traceonly; SYS@orcl>select id from t1; 1000 rows selected. Elapsed: 00:00:00.04 Statistics ———————————————————- 0 recursive calls 0 db block gets 503 consistent gets 0 physical reads 0 redo size 74196 bytes sent [...]

File[]按拼音排序

先定义一个内部类 public static class PyComparator implements Comparator { public int compare(Object arg0, Object arg1) { Collator collator = Collator.getInstance(new Locale(“zh”)); return collator.compare(arg0.toString(), arg1.toString()); } } 然后这样排序: Arrays.sort(files, new PyComparator()); 比较奇怪的是OuterClass的静态方法中对非静态的内部对象实例化方法: new OuterClass().new InnerClass()

dir命令知多少

dir /b /a:d /s 以上命令行,可实现广度优先遍历输出文件夹的名称 以此纪念我写的java深度遍历的几行代码,以及运行这个程序花费的两个小时、遍历完的27.8万个文件夹。 public static void dir(File file, int level) { try { System.out.println(String.valueOf(level) + ” ” + file.getPath()); File[] files = file.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { dir(files[i], level + 1); } } } } catch (Exception e) [...]

java操作文件和调用windows命令的一个例子

1、调用windows命令 commandString = “cmd /c dir”; Runtime.getRuntime().exec(commandString); 如果命令后的参数有空格的话,务必要用引号把参数括起来。 不幸的是,如果参数有两个以上的空格,即使用了引号也会出错,真正执行命令的参数只会保留一个空格。变通的方法就是下面示例的创建批处理文件。 2、创建批处理文件 public static void createBatFile(String fileName) { File file; FileOutputStream fos = null; PrintWriter pw = null; try { file = new File(“d:\caclsbat.bat”); if (!file.exists()) { file.createNewFile(); } fos = new FileOutputStream(file); pw = new PrintWriter(fos); String command = “cacls “” + fileName + “””; pw.write(command.toCharArray()); [...]

搞清楚一个关于“SAXException 未找到外部实体”的问题

一个应用程序新发版后,无法正常使用,从系统日志中查看下面的错误: Caused by: org.xml.sax.SAXException: Fatal Error: URI=null Line=5: 未找到外部实体“http://ibatis.apache.org/dtd/sql-map-2.dtd”。 根据发版前后更改内容的对比,很快排查出原因可能出在新加的iBatis配置文件,原来的配置文件中DOCTYPE部分对应的:http://www.ibatis.com/dtd/sql-map-2.dtd,但具体原因是什么? 在使用SAX解析XML文件的时候,会根据DOCTYPE中的定义的DTD验证XML文件的合法性,但是iBatis的XML配置文件中DOCTYPE中DTD文件地址是个公网地址,那么对不能上互联网的情况下如何处理呢? 在IBM DW的这篇文章中有一个解决方案,可以在解析XML的时候设定自己的EntityResolver,将公网地址映射到本地地址。下面是iBatis 2.3中实现类关键代码: public class SqlMapClasspathEntityResolver implements EntityResolver { private static final String SQL_MAP_CONFIG_DTD = “com/ibatis/sqlmap/engine/builder/xml/sql-map-config-2.dtd”; private static final String SQL_MAP_DTD = “com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd”; private static final Map doctypeMap = new HashMap(); static { doctypeMap.put(“http://www.ibatis.com/dtd/sql-map-config-2.dtd”.toUpperCase(), SQL_MAP_CONFIG_DTD); doctypeMap.put(“http://ibatis.apache.org/dtd/sql-map-config-2.dtd”.toUpperCase(), SQL_MAP_CONFIG_DTD); doctypeMap.put(“-//iBATIS.com//DTD SQL Map Config 2.0//EN”.toUpperCase(), SQL_MAP_CONFIG_DTD); doctypeMap.put(“-//ibatis.apache.org//DTD [...]

用jxl读取Excel日期单元格内容

if (cell.getType() == CellType.DATE) { DateCell dateCell = (DateCell) cell; Date date = dateCell.getDate(); System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(date)); }