Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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
Java Spring JDBCTemplate与访问存储过程时的简单JDBC性能_Java_Performance_Jdbc_Spring Jdbc_Jdbctemplate - Fatal编程技术网

Java Spring JDBCTemplate与访问存储过程时的简单JDBC性能

Java Spring JDBCTemplate与访问存储过程时的简单JDBC性能,java,performance,jdbc,spring-jdbc,jdbctemplate,Java,Performance,Jdbc,Spring Jdbc,Jdbctemplate,我面临的问题与使用JDBCTemplate通过存储过程访问数据的性能有关。相反,当我从简单的JDBC访问时,它工作得非常快 2019-12-04 11:55:43.924信息9512---[main]e.t.TestStoredProcPerformanceApplication:未设置活动配置文件,返回默认配置文件:默认 2019-12-04 11:55:46.002信息9512---[main]e.t.TestStoredRocPerformance应用程序:在2.831秒内启动TestSt

我面临的问题与使用JDBCTemplate通过存储过程访问数据的性能有关。相反,当我从简单的JDBC访问时,它工作得非常快

2019-12-04 11:55:43.924信息9512---[main]e.t.TestStoredProcPerformanceApplication:未设置活动配置文件,返回默认配置文件:默认 2019-12-04 11:55:46.002信息9512---[main]e.t.TestStoredRocPerformance应用程序:在2.831秒内启动TestStoredRocPerformance应用程序(JVM运行3.57秒)

尝试使用简单的Jdbc 正在尝试使用jdbcTemplate 2019-12-04 11:55:47.475信息9512---[main]com.zaxxer.hikari.HikariDataSource:hikaripol-1-开始。。。 2019-12-04 11:55:47.514信息9512---[main]com.zaxxer.hikari.pool.PoolBase:HikariPool-1-驱动程序不支持获取/设置连接的网络超时。(oracle.jdbc.driver.T4CConnection.getNetworkTimeout()I) 2019-12-04 11:55:47.524信息9512---[main]com.zaxxer.hikari.HikariDataSource:hikaripol-1-启动完成

 Calling get_all_persons Attempt : 1 took 226 milliseconds
 Calling get_all_persons Attempt : 2 took 111 milliseconds
 Calling get_all_persons Attempt : 3 took 112 milliseconds
 Calling get_all_persons Attempt : 4 took 128 milliseconds
 Calling get_all_persons Attempt : 5 took 111 milliseconds
 Calling get_all_persons Attempt : 6 took 97  milliseconds
 Calling get_all_persons Attempt : 7 took 98  milliseconds
 Calling get_all_persons Attempt : 8 took 98  milliseconds
 Calling get_all_persons Attempt : 9 took 99  milliseconds
2019-12-04 11:55:48.547信息9512---[extShutdownHook]com.zaxxer.hikari.HikariDataSource:hikaripol-1-已启动关机。。。 2019-12-04 11:55:48.566信息9512---[extShutdownHook]com.zaxxer.hikari.HikariDataSource:hikaripol-1-关闭完成

 Calling get_all_persons Attempt : 1 took 226 milliseconds
 Calling get_all_persons Attempt : 2 took 111 milliseconds
 Calling get_all_persons Attempt : 3 took 112 milliseconds
 Calling get_all_persons Attempt : 4 took 128 milliseconds
 Calling get_all_persons Attempt : 5 took 111 milliseconds
 Calling get_all_persons Attempt : 6 took 97  milliseconds
 Calling get_all_persons Attempt : 7 took 98  milliseconds
 Calling get_all_persons Attempt : 8 took 98  milliseconds
 Calling get_all_persons Attempt : 9 took 99  milliseconds
这个结果来自我的本地机器。当我实际使用JDBCTemplate访问office测试服务器时,它需要5到7秒,而简单的JDBC只需要2秒,即使我在每次迭代中创建连接也是如此。使用SpringJDBC模板,它将从application.properties创建2个连接

spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=system
spring.datasource.password=*****
spring.datasource.driver-class=oracle.jdbc.driver.OracleDriver
spring.datasource.type = com.zaxxer.hikari.HikariDataSource 
spring.datasource.hikari.maximum-pool-size=2
spring.datasource.hikari.leakDetectionThreshold=2000
spring.datasource.hikari.connectionTimeout=20000
spring.datasource.hikari.idleTimeout=500000
spring.datasource.hikari.maxLifetime=1700000
应用程序属性

spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=system
spring.datasource.password=*****
spring.datasource.driver-class=oracle.jdbc.driver.OracleDriver
spring.datasource.type = com.zaxxer.hikari.HikariDataSource 
spring.datasource.hikari.maximum-pool-size=2
spring.datasource.hikari.leakDetectionThreshold=2000
spring.datasource.hikari.connectionTimeout=20000
spring.datasource.hikari.idleTimeout=500000
spring.datasource.hikari.maxLifetime=1700000
用于访问存储过程的代码

@Component
public class Initializer2 implements ApplicationListener<ApplicationReadyEvent> {

    @Autowired
    private JdbcTemplate jdbcTemplate; 
    public static String packageName = "myPackage";
    public static String procName = "get_all_persons";

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        testStoredProcWithJdbc("");
        testStoredProcWithJdbcTemplate("");
    }

    private void testStoredProcWithJdbcTemplate(String string) {
        System.out.println("Trying with jdbcTemplate");
        try {
            for(int i = 1; i < 10; i++) {
                long startTime = System.currentTimeMillis();
                SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate);
                jdbcCall.withCatalogName(packageName);
                jdbcCall.withProcedureName(procName);
                jdbcCall.addDeclaredParameter(new SqlOutParameter("o_result_set", oracle.jdbc.OracleTypes.CURSOR));
                jdbcCall.addDeclaredParameter(new SqlOutParameter("o_message", oracle.jdbc.OracleTypes.VARCHAR));
                jdbcCall.execute();
                long endTime = System.currentTimeMillis();
                System.out.println("Calling get_all_persons Attempt : "+i+" took "+ (endTime - startTime) + " milliseconds");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void testStoredProcWithJdbc(String procName) {
        System.out.println("Trying with Simple Jdbc");
        try {
            for(int i = 1; i < 10; i++) {
                long startTime = System.currentTimeMillis();
                Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "system", "*****");
                CallableStatement cstmt = conn.prepareCall("call "+packageName+"."+procName+"(?,?)");
                cstmt.registerOutParameter("o_result_set", oracle.jdbc.OracleTypes.CURSOR);
                cstmt.registerOutParameter("o_message", oracle.jdbc.OracleTypes.VARCHAR); 
                cstmt.execute();
                ResultSet resultSet = (ResultSet) cstmt.getObject("o_result_set");
                List<Person> persons = new ArrayList<>();
                Map<String, Object> map = new HashMap<>();
                map.put("o_message", cstmt.getString("o_message"));
                while(resultSet.next()) {
                    Person person = new Person();
                    person.setId(resultSet.getInt("id"));
                    person.setName(resultSet.getString("name"));
                    person.setEmail(resultSet.getString("email"));
                    person.setMobile(resultSet.getLong("mobile"));
                    if(resultSet.getTimestamp("birthdate") != null)
                        person.setBirthDate(resultSet.getTimestamp("birthdate").toLocalDateTime());
                    persons.add(person);
                }
                map.put("o_result_set", persons);
                cstmt.close();
                conn.close();
                long endTime = System.currentTimeMillis();
                System.out.println("Calling get_all_persons Attempt : "+i+" took "+ (endTime - startTime) + " milliseconds");
            }
            System.out.println("Successful...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
@组件
公共类初始值设定项2实现ApplicationListener{
@自动连线
私有JdbcTemplate JdbcTemplate;
公共静态字符串packageName=“myPackage”;
公共静态字符串procName=“获取所有人”;
@凌驾
ApplicationEvent上的公共无效(ApplicationReadyEvent事件){
testStoredProcWithJdbc(“”);
testStoredProcWithJdbcTemplate(“”);
}
私有void testStoredProcWithJdbcTemplate(字符串){
System.out.println(“尝试使用jdbcTemplate”);
试一试{
对于(int i=1;i<10;i++){
long startTime=System.currentTimeMillis();
SimpleJdbcCall jdbcCall=新SimpleJdbcCall(jdbcTemplate);
jdbcall.withCatalogName(packageName);
jdbcCall.withProcedureName(procName);
addDeclaredParameter(新的SQLOutpParameter(“o_result_set”,oracle.jdbc.OracleTypes.CURSOR));
addDeclaredParameter(新的SqlOutParameter(“o_消息”,oracle.jdbc.OracleTypes.VARCHAR));
jdbcCall.execute();
long-endTime=System.currentTimeMillis();
println(“调用get_all_persons尝试:“+i+”花费“+(endTime-startTime)+”毫秒”);
}
}捕获(例外e){
e、 printStackTrace();
}
}
公共void testStoredProcWithJdbc(字符串procName){
System.out.println(“尝试使用简单Jdbc”);
试一试{
对于(int i=1;i<10;i++){
long startTime=System.currentTimeMillis();
Connection conn=DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:XE”,“system”,“*****”);
CallableStatement cstmt=conn.prepareCall(“调用”+packageName+“+procName+”(?,?)”);
cstmt.registerOutParameter(“o_result_set”,oracle.jdbc.OracleTypes.CURSOR);
registerOutParameter(“o_消息”,oracle.jdbc.OracleTypes.VARCHAR);
cstmt.execute();
ResultSet ResultSet=(ResultSet)cstmt.getObject(“o_result_set”);
List persons=new ArrayList();
Map Map=newhashmap();
map.put(“o_消息”,cstmt.getString(“o_消息”);
while(resultSet.next()){
Person=新人();
person.setId(resultSet.getInt(“id”);
person.setName(resultSet.getString(“name”);
person.setEmail(resultSet.getString(“email”);
person.setMobile(resultSet.getLong(“mobile”);
if(resultSet.getTimestamp(“生日”)!=null)
person.setBirthDate(resultSet.getTimestamp(“birthdate”).toLocalDateTime());
人。添加(人);
}
地图放置(“o_结果集”,人员);
cstmt.close();
康涅狄格州关闭();
long-endTime=System.currentTimeMillis();
println(“调用get_all_persons尝试:“+i+”花费“+(endTime-startTime)+”毫秒”);
}
System.out.println(“成功…”);
}捕获(例外e){
e、 printStackTrace();
}
}
}