java 每分钟查询一次java访问oracle数据库库是每次重开连接好还是新建

一个页面需要查询oracle数据库3次 ,如何让这3次查询同时进行
现在每一次查询数据库需要20秒 &3次总共需要60秒 &如果能同时进行查询的话 则大概需要20秒 左右 ,问题来了 如何实现让这3次查询同时进行 。。。。
以下是问题补充:
select id,val,time from packSigval s
where s.time&=? and s.time&=? and s.id=? and s.portId=?
order by time asc
查询60万条 用了30秒。。。。
数据库设计和页面设计有问题吧
数据库设计和页面设计有问题吧
异步请求调用
用线程池并发执行。
threadPoolExecutor.submit(task);
线程池,参考张开涛亿级流量书中并行的章节
数据库设计和页面设计有问题吧
需要20秒的查询本身就是问题,我觉得你可以从这里下手
--- 共有 3 条评论 ---
我尝试了用多线程让3个同时去查 结果发现 最终还是一个一个的查
时间没有缩短
: 一共才千万级的,每天能插入多少叫大量呢?有一百万吗?索引该加就要加,不能因为要插入数就不加,查询也很影响性能的
而且数据量大,你可以考虑分区分表啊,何必在一个表上吊死,多线程就是治标不治本,甚至标都治不了
每次查询出来的的数据大概在50-1000万之间 oracle数据库 不能加索引 因为每天还要插入大量数据
需要20秒的查询先从数据库的角度看看能不能优化,不行再看看能不能从业务角度优化,还不行如果是报表之类的,定时生成报表之类的去搞。
另外也可以从缓存的角度去优化
ajax请求三次
数据库查询超过3秒的都最好优化一下。
楼主的问题,可以看楼上有人提到线程池的解决方案:同时开启3个线程执行3个查询,等3个查询都完成了再往后执行。
我之前有写到一篇文章正好是解决这个问题的,可以参考一下我当时写的,地址:。当然了,sql执行那么慢,第一件事想到的还是应该优化sql和数据库设计。个人认为,线程池的作用应该是锦上添花,毕竟没有从根本上解决查询慢的问题。&&等查询Oracle数据库10W数据量时内存溢出,抛出java.lang.OutOfMemoryError: Java heap space,如何解决?查询oracle数据库数据大概60W条数据,但是每10K条数据查询也是出现java.lang.OutOfMemoryError: Java heap space错误情况。还有导出excel也是一样的错误。网上找了很多关于tomcat内存参数设置和jdk的vm设置还是无效,昨天弄了一天还是无法解决,在好多群里问了,也没有人能提供好的解决方法。所以上到网站想请教大神们寻找解决方案。此问题网上找遍了方法还是无法解决。15个牛币所有回答列表(6)&LV2catalina.bat文件加入set JAVA_OPTS=-Xms256m -Xmx512m -Djava.awt.headless=true [-XX:MaxPermSize=128M]如果是linux就是catalina.sh一次查10W的数据,没用分页&你可以用到批量读取的方式,先把获取的数据存到一个零时文件里面去,之后再以流的方式读取出来,这样的话,就不会报内存溢出了。 & -- & 仅供参考这个主要是你的代码问题,如果你的代码无限生成对象,那么你内存配置的再大都会报错的,检查一下你的代码,将生产大量对象的代码好好优化下,减少java对象的生成,尤其是循环的代码块要特别注意,不懂怎么操作继续问我window下面设置是这样的。不用设置initial memory pool、maximum memory pool 、thread stack size。上面的设置只要最大内存不超出物理内存的4/1都没事。如果这样还不行、那可能得优化下你代码了建议批量读取数据放到NoSQL中,然后再从NoSQL中读取。等等等等等等等等等完完等相关问答等等最近浏览暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友nodejs中,mysql连接——是每次查询连接一次数据库,还是启动node时连接数据库,关闭时再断开好呢
因为我之前用php,都是每次查询的时候才连接,查询完了就关闭的,但是用nodejs,我发现其实压根没必要每次查询都连接-关闭啊,启动node app的时候连接,然后保持连接,怎么查询都没看出有什么不好的地方啊,想问一下到底我这个做法对不对?还是说不同需求有不同做法?
mysql是有连接池的 并发大的情况下 如果你之前的连接不关闭 连接池满了 请求无法处理 程序就会阻塞 因此是用完是需要释放的
两种方式解决
1、你可以配置mysql的连接池
var mysql = require('mysql');
var pool = mysql.createPool({
host: 'localhost',
user: 'nodejs',
password: 'nodejs',
database: 'nodejs',
port: 3306
var selectSQL = 'select * from t_user limit 10';
pool.getConnection(function (err, conn) {
if (err) console.log("POOL ==& " + err);
conn.query(selectSQL,function(err,rows){
if (err) console.log(err);
console.log("SELECT ==& ");
for (var i in rows) {
console.log(rows[i]);
conn.release();
2、你可以使用断线重连的方式来解决
var mysql = require('mysql');
function handleError () {
conn = mysql.createConnection({
host: 'localhost',
user: 'nodejs',
password: 'nodejs',
database: 'nodejs',
port: 3306
//连接错误,2秒重试
conn.connect(function (err) {
if (err) {
console.log('error when connecting to db:', err);
setTimeout(handleError , 2000);
conn.on('error', function (err) {
console.log('db error', err);
// 如果是连接断开,自动重新连接
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
handleError();
handleError();
更多相关文章
在nodejs 操作mysql 时 ,我遇到了这样的问题: 一次http请求需要执行多个query,所有为了减少callback 我使用async中的waterfall函数 将query分函数来写,并且将mysql的句柄conn 进行传递,最后在waterfall的callback函数中关闭数据库连 ...
下面来给大家介绍一篇linux中利用ControlPersist提升SSH的连接速度,有需要了解的朋友可参考一下.背景介绍:目前,项目中服务器的配置管理已经全部从Puppet迁移到了Ansible,而之前一直认为不会带来困扰的SSH通道慢的问题则暴露的很明显了.因为很多时候需要同时更新几百台服务器, ...
使用windows 7的朋友可能发现在windows 7下创建带宽连接的方法与在windows xp有不小的区别,下面我来给大家介绍windows 7中如何创建一个ADSL宽带连接账号吧,有需要了解的朋友可进入参考.1.首先建立宽带连接,WIN7和XP一样,在“网络”右键属性或“IE” “连接”的I ...
上一篇文章我就为大家介绍过关于CentOS6中mysql主主复制配置了,下面我们来看一mysql主从复制的配置步骤,希望对各位有帮助.mysql复制的优点主要包括以下3个方面:1.如果主服务器出现问题,可以快速切换到从服务器提供的服务2.可以在从服务器上执行查询操作,降低主服务器的访问压力3.可以在 ...
前面讲过mysql热备份,下面小编再来给各位同学介绍一下在CENTOS6.3中MYSQL主从数据库备份配置的方 法,希望此教程 对各位同学会有所帮助哦. MySQL主主互备结构是基于mysql增量日志基础上的,区别于主从复制结构. 在主主复制结构中,两台服务器的任何一台上面的数据库存发生了改变都会同 ...
在Xampp中mysql默认密码是空的,如果你要设置密码我们可以直接使用Xampp中的mysqladmin.exe命令来进行修改密码,修改之后我们在Xampp自带的phpmyadmin中也可加密码.MySQL 的“root”用户默认状态是没有密码的,所以在 PHP 中您可以使用 mysql_conn ...
单位新装一台MAS短信机,由于使用的是内部网络,内网不允许使用外网DNS解释,只能使用内网DNS,在开发单位内的一些应用系统与MAS对接发短信时遇到了接口初始化及发送短信都非常缓慢,等待时间在10秒左右.由于MAS机是一台Linux的服务器,采用的是MYSQL数据库,采用DB或API方式连接MAS其 ...
发现在监控内web服务器有点不正常,cpu和负载会突然增高,然后过十来分钟就会恢复正常.ssh连上去看,有几个php-cgi进程cpu的使用是100%.当时怀疑可能是有个别程序没写好,就通知开发这边去查了.从下图可以看到:
随着访问量的增加,到了昨天,好几台web都出现这种现象,并且cpu和负载都 ...
Wappalyzer是一个Firefox扩展,在网络上跟踪软件分发,并告诉您的维基,留言板 ...
本文章来给各位同学介绍关于js中dijit.form.DateTextBox日期自动转化方法详解,希望些方法对各位同学有所帮助.调查了一下,可以用下面的代码来解决.如下代码: 代码如下 dojo.declare(&q ...
iphone6 Siri不能拨打三位亲情号码怎么办呢?这个问题很多朋友有碰到就是使用iph ...
指纹登录功能我们最多会说到是手机了有的功能了,不过现在的windows系统也具备此功能了,但有朋友会发现刷指纹登录系统提示需要按Ctrl+Alt+Delete才能切换提示了,希望文章能够帮助到各位朋友,有兴趣的朋友可 ...
Appweb v6.0.0 发布下载,更新内容如下:Major Feature Relea ...
发布日期:9更新日期:2受影响系统:Libav Lib ...
Google 继之前在 Google Drive 上加入支持 Office 文件的编辑之后 ...
今天安装Java JDK 8 108版时安装程序弹出提示,大意是 Java 8 需要更新版 ...
Oracle数据库发展到今天,“IO为王”已经是一种发展方向趋势.ExtraData一体机 ...
Spring for Apache Hadoop 2.3 rc1 发布下载,主要更新内容如 ...JAVA频繁访问oracle数据库获取记录,使用什么连接方式最好?? - ITeye问答
JAVA频繁访问oracle数据库获取记录(间隔1秒就读取数据库记录或修改数据库记录),使用什么连接方式最好(高效)??,用jdbc连接池好吗?,怎么使用jdbc连接池后释放资源而不关闭连接呢??,谢谢各位了!!
问题补充:freish 写道必须要用jdbc连接池啊!c3p0,dbcp,bonecp都行
连接中的连接都是extends Connection的,重写了close方法,将其归还到池中,所以你调用从连接池中获取的Connection的close方法并没有关闭物理连接,只是将其归还到池中了
调用存储过程比较好的是哪一种,我是swing里面的
问题补充:freish 写道引用调用存储过程比较好的是哪一种,我是swing里面的
依然是连接池
有例子吗,我在调用时,总是报“超出打开游标的最大数”,谢谢
问题补充:freish 写道有例子吗,我在调用时,总是报“超出打开游标的最大数”,谢谢
这个应该是没有及时关闭一些statement或者preparedstatement导致的,如,在for循环中使用同一个statement超过几百次等
可以加大open_cursors的值,但要从根本上解决问题,还得从statement着手
我调用的存储过程 callablestatement cs =& connection.preparecall("...");
使用完了之后就关闭了,cs.close()
还是报这个超出打开游标的最大数“的异常
问题补充:freish 写道引用我调用的存储过程 callablestatement cs =& connection.preparecall("...");
使用完了之后就关闭了,cs.close()
还是报这个超出打开游标的最大数“的异常
这个调用并发有多大,会不会超过open_cursors的参数的值
应该不会,只有我这里才会去访问,且等待3秒才调用一次
问题补充:freish 写道引用我调用的存储过程 callablestatement cs =& connection.preparecall("...");
使用完了之后就关闭了,cs.close()
还是报这个超出打开游标的最大数“的异常
这个调用并发有多大,会不会超过open_cursors的参数的值
测试在一个循环里面进行的,请问怎么在存储过程执行后,得到结果集完了之后释放资源呢,就是关闭游标。
问题补充:请问怎么在存储过程执行后,得到结果集完了之后,释放资源呢,就是关闭游标。
问题补充:freish 写道问题补充:
请问怎么在存储过程执行后,得到结果集完了之后,释放资源呢,就是关闭游标。
close &cursor_name&;
cursor mycur is select empno,ename,
vempno emp.empno%
vename emp.ename%
vjob emp.job%
fetch mycur into vempno,vename,
exit when mycur%
if mycur%found then
dbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob);
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
我需要在存储过程中返回游标,在JAVA这边调用,循环遍历。
问题补充:freish 写道问题补充:
请问怎么在存储过程执行后,得到结果集完了之后,释放资源呢,就是关闭游标。
close &cursor_name&;
cursor mycur is select empno,ename,
vempno emp.empno%
vename emp.ename%
vjob emp.job%
fetch mycur into vempno,vename,
exit when mycur%
if mycur%found then
dbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob);
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
谢谢,如果在存储过程内部关掉游标,我java这边就得不到值了。
有其他方案解决“超出打开游标最大数”
问题补充:
请问怎么在存储过程执行后,得到结果集完了之后,释放资源呢,就是关闭游标。
close &cursor_name&;
cursor mycur is select empno,ename,
vempno emp.empno%
vename emp.ename%
vjob emp.job%
fetch mycur into vempno,vename,
exit when mycur%
if mycur%found then
dbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob);
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
引用我调用的存储过程 callablestatement cs =& connection.preparecall("...");
使用完了之后就关闭了,cs.close()
还是报这个超出打开游标的最大数“的异常
这个调用并发有多大,会不会超过open_cursors的参数的值
有例子吗,我在调用时,总是报“超出打开游标的最大数”,谢谢
这个应该是没有及时关闭一些statement或者preparedstatement导致的,如,在for循环中使用同一个statement超过几百次等
可以加大open_cursors的值,但要从根本上解决问题,还得从statement着手
引用调用存储过程比较好的是哪一种,我是swing里面的
依然是连接池
1.使用jdbc最快
2.一般项目都是使用连接池机制(具体原因的话不用我多说)
3.连接池的机制是保持一定的连接数量在池中,待使用的时候直接冲池中取,用完了再放回池中,真实的物理链接并不会关闭。
用连接池啊。让连接池帮你管理连接的生命周期。
数据库连接池维护一些数量的和数据库的连接,这些连接的生命周期由连接池管理,包括连接的建立和关闭。
应用要使用数据库连接时,从连接池中获得一个连接,用完以后再将这个连接放回连接池。应用不需要关心连接的生命周期。
应用释放连接到连接池虽然调用的是close方法,但这个方法实际上只是将连接放回连接池而已。
引用怎么使用jdbc连接池后释放资源而不关闭连接这个不太可能吧
必须要用jdbc连接池啊!c3p0,dbcp,bonecp都行
连接中的连接都是extends Connection的,重写了close方法,将其归还到池中,所以你调用从连接池中获取的Connection的close方法并没有关闭物理连接,只是将其归还到池中了
已解决问题
未解决问题import java.sql&&
import java.sql.C
import java.sql.DriverM
import java.sql.ResultS
import java.sql.SQLE
import java.sql.S
public class JDBCDemo {
public static void main(String[] args){
Connection conn =
ResultSet rs =
//加载驱动
Clas敏感词orName(&oracle.jdbc.OracleDriver&);
//获得连接
conn = DriverManager.getConnection(
&jdbc:oracle:thin:@localhost:1521:orcl&,
Statement stat = conn.createStatement();
String sql = &SELECT * FROM emp&;
//执行语句获得结果集
rs = stat.executeQuery(sql);
//遍历结果集
while(rs.next()){
String name = rs.getString(&name&);
System.out.println(name);
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭连接
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
京ICP备号-4
扫一扫,把题目装进口袋}

我要回帖

更多关于 java访问oracle数据库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信