Skip to content

Commit 4f00ff4

Browse files
committed
update
1 parent 5d2ef4c commit 4f00ff4

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

README.md

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -469,20 +469,37 @@ phantomjs + selenium
469469
图像识别
470470

471471
### 如何实现数据库连接池
472-
1. 连接池的建立。使用Vector存储连接,连接池在池中创建了几个连接对象等待使用,连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销
472+
1. 连接池的建立。使用CopyOnWriteArrayList存储连接,连接池在池中创建了几个连接对象等待使用,连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销
473473
2. 连接池的管理。当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。
474474
3. 连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。
475475

476-
#### 并发、性能问题
477-
synchronized、lock
476+
#### [并发、性能问题](http://0x0010.com/2017/09/performance-promote-of-using-threadlocal-in-hikaricp/)
477+
使用synchronized、lock可解决多线程分发与回收线程问题
478478

479-
但为了提高性能,可进行以下方面的优化:
479+
但性能问题还是很大,主要是因为线程的同步操作涉及到线程的启动、停止、上下文切换,所以为了提高性能,可进行以下方面的优化:
480+
避免同步操作,更换为其他操作。使用ThreadLocal将线程池的副本保存在每个线程中,同时结合CAS处理连接的分发与回收
481+
482+
#### 增加连接超时功能
483+
参考HikariCP中CurrentBag中borrow方法:
484+
485+
```
486+
timeout = timeUnit.toNanos(timeout);
487+
do {
488+
final long start = currentTime();
489+
// 如果队列中没有可以用的连接实例,返回null
490+
// 如果队列中有可以用的实例,那么把状态改成USE并且返回
491+
final T bagEntry = handoffQueue.poll(timeout, NANOSECONDS);
492+
if (bagEntry == null || bagEntry.compareAndSet(STATE_NOT_IN_USE, STATE_IN_USE)) {
493+
return bagEntry;
494+
}
495+
496+
// timeout循环被减小,直到大于0.01毫秒
497+
timeout -= elapsedNanos(start);
498+
} while (timeout > 10_000);
499+
500+
```
480501

481-
1. Vector换成CopyOnWriteArrayList
482-
2. 避免锁竞争的耗时,应该对连接的管理使用CAS操作;使用ThreadLocal将得到的数据库连接与线程绑定,避免映射关系的同步管理与性能问题
483502

484-
#### 事务处理
485-
在Java语言中,Connection类本身提供了对事务的支持,可以通过设置Connection的AutoCommit属性为 false,然后显式的调用commit或rollback方法来实现。
486503

487504
### [如何存储查询大量的HTML文件](https://www.zhihu.com/question/26504749)
488505

0 commit comments

Comments
 (0)