作者aegis105 (NO)
看板java
标题[问题] Spring JDBC可以控制特定Connection吗?
时间Tue Mar 8 20:07:47 2016
各位JAVA前辈好
先描述一下目前状况
--
架构:
Web application使用Spring框架
而Spring JDBC的Datasource有使用connection pool
--
需求:
DB已经有一个table 该table是空的 是一个temp table
但我不知道这种规则叫做什麽 以下简单举个例子
EX:当有一个connection对该table insert 100笔
connection还没断的时候里面资料都存在
等到该connection断了 table即会自动清空
而我要使用Spring JDBC 对其进行操作
--
现况:
因为Spring JDBC中的jdbctemplate会帮我们管理connection
但是我需要使用特定单一的connection 一口气做完所有动作
做完之後将该connection给close 使table自动清空
目前的想法是:
//取得单一连线?
Connection con = jdbctemplate.getdatasource().getconnection();
//做完所有动作
//关闭此连线 让table自动清空
con.close();
问题:
1.请问若像上面的作法是否就可以达成控制单一connection的需求呢?
2.因为底层是connection pool 是否会造成其他影响?
或者...事情根本不是我想的这样
恳请各位前辈不吝指教 谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.24.60.237
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1457438870.A.025.html
1F:→ ssccg: temp table是在commit的时候清空,跟connection无关 03/08 20:41
2F:→ ssccg: 你需要的是Transaction 03/08 20:42
3F:→ ssccg: 没有用transaction时JdbcTemplate每个动作会auto commit 03/08 20:45
抱歉我补充一下
我要insert资料至temp table A 此时会commit
然後再和table B 作join 取出需要的资料
然後A就不需要再用了 当该Connection断了後 A自动清空 这是DB作的
同一个Connection连线&中断 都是DB判断的
谢谢一楼提供的意见!
※ 编辑: aegis105 (114.24.60.237), 03/08/2016 20:56:19
4F:→ ssccg: 忘了问哪种DB,因为你说的像oracle的所以上面是说oracle的 03/08 21:13
5F:→ ssccg: 你table A资料作完就不用了,那为什麽要commit? 03/08 21:13
是oracle没错
因为资料笔数非常大量
temp table A的机制是DBA建议&设计的
先将大量资料commit到A 之後和B(资料笔数更多)join 得出结果
不知道是否有回答到您的问题 或是其实有更好作法呢
※ 编辑: aegis105 (114.24.60.237), 03/08/2016 21:29:36
※ 编辑: aegis105 (114.24.60.237), 03/08/2016 21:32:47
6F:→ ssccg: oracle的temp table是在commit(结束transaction时清空) 03/08 21:41
7F:→ ssccg: 所以就是开一个transaction中作完insert、join select 03/08 21:42
8F:→ ssccg: 之後再commit 03/08 21:42
9F:→ ssccg: 我猜你把commit当成insert... 03/08 21:44
疑.. 但我没有搞混commit和insert
使用的方式和ss大说的有点像又不太一样
我今天测试的方式:
用一个connection > insert 1笔资料 > commit
> select确实有那一笔
中断connection > 重新开connection
> select table是空的
有点混乱啊..
※ 编辑: aegis105 (114.24.60.237), 03/08/2016 22:19:44
10F:→ yyc1217: 建立connection的成本蛮大的 如果太频繁的确会造成影响 03/08 23:04
11F:→ yyc1217: 这也是为什麽有connection pool 用query清空也许比较好 03/08 23:04
12F:→ yyc1217: 或是每次建立不同的temp表 db再用排程删掉 03/08 23:06
13F:→ adrianshum: Oracle temp table 建立时可指明commit 或connection 03/09 01:10
14F:→ adrianshum: close 时清空。另,因为connection pool 并不会真的c 03/09 01:10
15F:→ adrianshum: lose connection,类似情况下不建议用後者 03/09 01:10
16F:→ ssccg: 我不知道可以设成connection close时清空,不过因为pool的 03/09 02:56
17F:→ ssccg: 关系通常是用commit时清空的用法吧 03/09 02:56
18F:→ ssccg: 如果是connection时清空,在用pool的情况下你只能自己每个 03/09 02:56
19F:→ ssccg: transaction去做trucate了 03/09 02:57
20F:→ ssccg: 只要有用connection pool,上层取到的connection都是wrap过 03/09 02:58
21F:→ ssccg: 的,你close都只是把connection还回pool,不能真的关掉 03/09 02:58
22F:→ ssccg: 可以要求改DB定义的话去换成on commit delete吧 03/09 03:03
23F:推 cug990617: 你可以试着写一个Procedure,把资料送进去後再处理 03/09 13:23
24F:推 j16598231: 试试用batch? 03/09 21:36
25F:推 kiwatami: temp table可以用stored procedure开 执行完就消失了 03/10 12:02
26F:→ kiwatami: 不需要管连线 要做这种一堆处理的写在里面速度会快点 03/10 12:02