Skip to content

Commit ee728d5

Browse files
committed
async jdbc endurance test
1 parent 230a5de commit ee728d5

File tree

2 files changed

+144
-1
lines changed

2 files changed

+144
-1
lines changed

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
"dependencies": {
3333
},
3434
"devDependencies": {
35-
"nodeunit": "~0.6.4"
35+
"nodeunit": "~0.6.4",
36+
"memwatch": "~0.2.0",
37+
"async": "~0.1.22"
3638
},
3739
"scripts": {
3840
"test": "nodeunit test"
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
'use strict';
2+
3+
// Tests concurrent async jdbc connections.
4+
// TODO: a proper jdbc wrapper should be created to avoid ugly async code.
5+
6+
var memwatch = require('memwatch');
7+
var async = require('async');
8+
9+
// 1 - 23,305ms
10+
// 10 - 8,846ms
11+
var concurrency = 10;
12+
13+
//var dbServerName = '192.168.13.190';
14+
//var dbPort = 1433;
15+
//var dbName = 'test';
16+
//var dbUserId = 'test';
17+
//var dbPassword = 'test';
18+
//var dbConnectString = 'jdbc:sqlserver://' + dbServerName + ':' + dbPort + ';databaseName=' + dbName + ';selectMethod=direct;responseBuffering=adaptive;packetSize=0;programName=nodeJavaTest;hostProcess=nodeJavaTest;sendStringParametersAsUnicode=false;';
19+
//var dbConnectionClass = 'com.microsoft.sqlserver.jdbc.SQLServerDriver';
20+
21+
var dbUserId = 'test';
22+
var dbPassword = 'test';
23+
var dbConnectString = "jdbc:mysql://localhost/test";
24+
var dbConnectionClass = 'com.mysql.jdbc.Driver';
25+
26+
var util = require('util');
27+
var path = require('path');
28+
var java = require('../../');
29+
java.classpath.push(path.join(__dirname, 'sqljdbc4.jar'));
30+
java.classpath.push(path.join(__dirname, 'mysql-connector-java-5.1.22-bin.jar'));
31+
var DriverManager = java.import('java.sql.DriverManager');
32+
33+
setTimeout(function() {
34+
console.log('start heap diff');
35+
var hd = new memwatch.HeapDiff();
36+
var loopStart = new Date();
37+
38+
java.findClassSync(dbConnectionClass);
39+
40+
var loopIterations = [];
41+
for(var i=0; i<5000; i++) {
42+
loopIterations.push(i);
43+
}
44+
45+
async.forEachLimit(
46+
loopIterations,
47+
concurrency,
48+
function(loopCount, callback) {
49+
console.log('loopCount:', loopCount);
50+
return doLoop(callback);
51+
},
52+
function(err) {
53+
if (err) {
54+
console.log("fail", err);
55+
}
56+
var loopEnd = new Date();
57+
console.log('end loop', loopEnd - loopStart);
58+
memwatch.gc();
59+
var diff = hd.end();
60+
console.log(util.inspect(diff.change, false, 10, true));
61+
62+
console.log("done... waiting 30seconds");
63+
setTimeout(function() {
64+
console.log("really done");
65+
}, 30 * 1000);
66+
}
67+
);
68+
}, 1);
69+
70+
function doLoop(callback) {
71+
var conn;
72+
var columnCount;
73+
var rs;
74+
75+
return DriverManager.getConnection(dbConnectString, dbUserId, dbPassword, getConnectionComplete);
76+
77+
function getConnectionComplete(err, _conn) {
78+
if (err) {
79+
return callback(err);
80+
}
81+
conn = _conn;
82+
83+
//console.log("connected");
84+
var statement = conn.createStatementSync();
85+
var queryString = "select * from Person";
86+
return statement.executeQuery(queryString, executeQueryComplete);
87+
}
88+
89+
function executeQueryComplete(err, _rs) {
90+
if (err) {
91+
return callback(err);
92+
}
93+
rs = _rs;
94+
95+
columnCount = rs.getMetaDataSync().getColumnCountSync();
96+
97+
var rsComplete = false;
98+
async.until(
99+
function() { return rsComplete; },
100+
function(callback) {
101+
return rs.next(function(err, rsNextResult) {
102+
if (err) {
103+
return callback(err);
104+
}
105+
if (!rsNextResult) {
106+
rsComplete = true;
107+
return callback();
108+
}
109+
return printRow(callback);
110+
});
111+
},
112+
function(err) {
113+
if (err) {
114+
return callback(err);
115+
}
116+
return conn.close(callback);
117+
}
118+
);
119+
}
120+
121+
function printRow(callback) {
122+
for (var i = 1; i <= columnCount; i++) {
123+
var obj = rs.getObjectSync(i);
124+
if (obj) {
125+
if (obj.hasOwnProperty('getClassSync')) {
126+
if (obj.getClassSync().toString() == 'class java.math.BigDecimal') {
127+
//console.log(obj.doubleValueSync());
128+
continue;
129+
}
130+
if (obj.getClassSync().toString() == 'class java.sql.Timestamp') {
131+
//console.log(obj.getTimeSync());
132+
continue;
133+
}
134+
//console.log("class:", obj.getClassSync().toString());
135+
}
136+
//console.log(obj);
137+
}
138+
}
139+
return callback();
140+
}
141+
}

0 commit comments

Comments
 (0)