JDBC从瞎搞到进阶

这里写图片描述
JDBC从瞎搞到熟悉里面讲了如何创建jdbc、如何执行不同语句,如果获取结果,分别是由DriverManager、Connection、Statement、ResultSet等接口共同执行的,但是在实际使用过程中,有些问题会让我们不得不去使用某些特别的方法来简化我们的操作。

1、为什么不用Statement
相信写过jdbc的同学都有一种同感:“我永远不可能第一遍写对”,是的,因为Statement语句使用的是传入sql语法的字符串来进行操作,但是字符串拼接既要考虑特殊字符、又要考虑SQL的语法,因此,可能你一个好心情就这样被毁了,让我们来回味一下,一个使用Statement的语句可能会是什么样子的?
普通版本:
这里写图片描述
进阶版本:
这里写图片描述
上面的代码示意了一个在崩溃边缘的程序员碰到的事情,这样的语句,一方面不方便调试,另一方面代码可读性也很差,很有可能会导致这个崩溃的程序员做出过激举动,因此,关爱程序员从我们做起,我们墙裂推荐另一个接口:PreparedStatement

我们为什么说PreparedStatement好,那么我就给你看看好在哪里?
普通版本:
这里写图片描述
进阶版本:
这里写图片描述
当当!当时那个凌乱的sql语句,就被我们这么简单的化解掉了,是不是看起来清爽了许多,甚至就连武汉的天气都没那么热了。这样再复杂的sql语句,也能通过如此的形式,将我们要插入的值使用?来表示,其他的预先写好,既方便调试,又容易理解,因此为何不选择PreparedStatement呢?

使用方法:PreparedStatement也有三种操作函数:execute、executeQuery、executeUpdate,使用方式与Statement相同,只是这三个函数不需要带参数了,因为一个PreparedStatement可以预先写好语句,因此只需要执行即可。Jdk1.8中新添加了executeLargeUpdate,用于操作影响行数过大,导致无法用int来表示的情况,所以没事就别用这个,返回值类型是Long。

那么如何设置参数?这个就更简单了,只需要调用setXXX函数,第一个参数来指定第几个?,第二个参数来指定填入的内容,而XXX则可以是Boolean,Float,Int,String等,因此非常方便实用,并且语句可以重复使用,修改只需要重新set到指定index即可,不过这里要注意的就是index是从1开始的

2、为什么不创建一个Connection
在我们的例子中,使用一个Connection、一个Statement就可以完全够用了,因为操作量小、没有资源的争夺问题,但是当程序并发、访问量大并且同时操作,一个Connection就会显得力不从心,因为不是线程安全的,因此会产生并发的混乱,而且底层TCP连接,如果使用一个Connection也会影响传输效率,因此对于多线程、多操作的情况下,不建议使用一个Connection来进行所有数据库操作
3、为什么不每次操作都创建Connection
我们知道,Connection是需要通过DriverManager.getConnection获得的,那么每次getConncetion,这种连接操作消耗较大,时间较久,都需要向数据库建立TCP连接,如果访问量大,连接数过多,无法管理,浪费资源,而忘记释放的资源也会引起GC,导致运行变慢。

解决方法:使用连接池
因为2、3的问题,在程序初始化的时候,提前创建多个数据库连接,集中管理,这样保证了运行时的效率,也能够对连接进行管理,同时针对连接的使用量可以动态新建连接或关闭连接。下面是一个简易连接池的实现,类似于消息队列的实现形式
这里写图片描述
其中isEmpty,isFull是用来加锁,MAX_CONNECTION指的是数据库最大连接数,count指的当前空闲连接数,connectionList则是用来保存连接的数据结构,static代码块中包含初始化代码
这里写图片描述

获得连接,通过synchronized获得对下列代码块的互斥锁,while循环则是用来判断是否有空闲连接的存在,若没有存在,当前线程全部阻塞,调用isEmpty.wait(),直到有一个连接被释放,并且添加到connectionList中,其中一个连接被唤醒,然后获得连接,同时将记录-1,得到链表的最后一个,并且释放因为连接满而阻塞的其他线程

同理,释放连接的方法:
这里写图片描述
添加队列,增加记录,唤醒等待连接

这就是一个简易的连接池实现,也可以考虑添加维护线程,用于检测等候获取数据库的线程阻塞时间,来动态调配连接数,生成新的连接供使用,或者关闭过久不用的连接已节约数据库资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值