aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2011-11-30 09:17:15 +0000
committerAnton Tananaev <anton.tananaev@gmail.com>2011-11-30 09:17:15 +0000
commit7ffae028567080b04e75c1f5ec8801da5c8106d0 (patch)
tree29e62e781b5466681155c192d0db703fc4574cb0
parentdcdea45edb7ee84b3eafd5593965e30b5cc077ab (diff)
downloadtraccar-server-7ffae028567080b04e75c1f5ec8801da5c8106d0.tar.gz
traccar-server-7ffae028567080b04e75c1f5ec8801da5c8106d0.tar.bz2
traccar-server-7ffae028567080b04e75c1f5ec8801da5c8106d0.zip
-rw-r--r--src/org/traccar/Server.java29
-rw-r--r--src/org/traccar/helper/AdvancedConnection.java57
-rw-r--r--src/org/traccar/helper/NamedParameterStatement.java55
3 files changed, 113 insertions, 28 deletions
diff --git a/src/org/traccar/Server.java b/src/org/traccar/Server.java
index a747df536..f2c5752f5 100644
--- a/src/org/traccar/Server.java
+++ b/src/org/traccar/Server.java
@@ -22,8 +22,6 @@ import java.util.LinkedList;
import java.util.Properties;
import java.io.FileInputStream;
import java.io.IOException;
-import java.sql.DriverManager;
-import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
@@ -53,6 +51,7 @@ import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.SimpleChannelHandler;
+import org.traccar.helper.AdvancedConnection;
import org.traccar.protocol.gl100.Gl100ProtocolDecoder;
import org.traccar.protocol.xexun2.Xexun2ProtocolDecoder;
@@ -102,13 +101,10 @@ public class Server implements DataManager {
}
/**
- * Database connection
+ * Database statements
*/
- private Connection connection;
-
- private String selectDeviceQuery;
-
- private String insertPositionQuery;
+ private NamedParameterStatement selectDevice;
+ private NamedParameterStatement insertPosition;
/**
* Init database
@@ -126,15 +122,13 @@ public class Server implements DataManager {
String url = properties.getProperty("database.url");
String user = properties.getProperty("database.user");
String password = properties.getProperty("database.password");
+ AdvancedConnection connection = new AdvancedConnection(url, user, password);
- if (user != null && password != null) {
- connection = DriverManager.getConnection(url, user, password);
- } else {
- connection = DriverManager.getConnection(url);
- }
+ String query = properties.getProperty("database.selectDevice");
+ selectDevice = new NamedParameterStatement(connection, query);
- selectDeviceQuery = properties.getProperty("database.selectDevice");
- insertPositionQuery = properties.getProperty("database.insertPosition");
+ query = properties.getProperty("database.insertPosition");
+ insertPosition = new NamedParameterStatement(connection, query);
}
/**
@@ -148,8 +142,6 @@ public class Server implements DataManager {
List deviceList = new LinkedList();
- NamedParameterStatement selectDevice =
- new NamedParameterStatement(connection, selectDeviceQuery);
ResultSet result = selectDevice.executeQuery();
while (result.next()) {
Device device = new Device();
@@ -177,9 +169,6 @@ public class Server implements DataManager {
public synchronized void setPosition(Position position) throws SQLException {
- NamedParameterStatement insertPosition =
- new NamedParameterStatement(connection, insertPositionQuery);
-
insertPosition.setLong("device_id", position.getDeviceId());
insertPosition.setTimestamp("time", position.getTime());
insertPosition.setBoolean("valid", position.getValid());
diff --git a/src/org/traccar/helper/AdvancedConnection.java b/src/org/traccar/helper/AdvancedConnection.java
new file mode 100644
index 000000000..4b91ee1f5
--- /dev/null
+++ b/src/org/traccar/helper/AdvancedConnection.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2010 Anton Tananaev (anton@tananaev.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.traccar.helper;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+public class AdvancedConnection {
+
+ /**
+ * Database connection
+ */
+ private Connection connection;
+
+ /**
+ * Connection attributes
+ */
+ private String url;
+ private String user;
+ private String password;
+
+ public AdvancedConnection(String url, String user, String password) {
+ this.url = url;
+ this.user = user;
+ this.password = password;
+ }
+
+ public final void reset() throws SQLException {
+ if (user != null && password != null) {
+ connection = DriverManager.getConnection(url, user, password);
+ } else {
+ connection = DriverManager.getConnection(url);
+ }
+ }
+
+ public Connection getInstance() throws SQLException {
+ if (connection == null) {
+ reset();
+ }
+ return connection;
+ }
+
+}
diff --git a/src/org/traccar/helper/NamedParameterStatement.java b/src/org/traccar/helper/NamedParameterStatement.java
index 9464d86a8..bbb2bcdf3 100644
--- a/src/org/traccar/helper/NamedParameterStatement.java
+++ b/src/org/traccar/helper/NamedParameterStatement.java
@@ -1,6 +1,20 @@
+/*
+ * Copyright 2010 Anton Tananaev (anton@tananaev.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.traccar.helper;
-import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -18,31 +32,40 @@ public class NamedParameterStatement {
/**
* Native statement
*/
- private final PreparedStatement statement;
+ private PreparedStatement statement;
/**
* Index mapping
*/
private final Map indexMap;
+
+ /**
+ * Query string
+ */
+ private final String parsedQuery;
+
+ /**
+ * Database connection
+ */
+ private AdvancedConnection connection;
/**
* Initialize statement
*/
- public NamedParameterStatement(Connection connection, String query)
- throws SQLException {
+ public NamedParameterStatement(AdvancedConnection connection, String query) {
indexMap = new HashMap();
- String parsedQuery = parse(query, indexMap);
- statement = connection.prepareStatement(parsedQuery);
+ parsedQuery = parse(query, indexMap);
+ this.connection = connection;
}
/**
* Parse query
*/
- static final String parse(String query, Map paramMap) {
+ static String parse(String query, Map paramMap) {
int length = query.length();
- StringBuffer parsedQuery = new StringBuffer(length);
+ StringBuilder parsedQuery = new StringBuilder(length);
boolean inSingleQuote = false;
boolean inDoubleQuote = false;
int index = 1;
@@ -96,6 +119,14 @@ public class NamedParameterStatement {
* Execute query with result
*/
public ResultSet executeQuery() throws SQLException {
+ try {
+ if (statement == null) {
+ statement = connection.getInstance().prepareStatement(parsedQuery);
+ }
+ } catch (SQLException error) {
+ connection.reset();
+ statement = connection.getInstance().prepareStatement(parsedQuery);
+ }
return statement.executeQuery();
}
@@ -104,6 +135,14 @@ public class NamedParameterStatement {
* Executes query without result
*/
public int executeUpdate() throws SQLException {
+ try {
+ if (statement == null) {
+ statement = connection.getInstance().prepareStatement(parsedQuery);
+ }
+ } catch (SQLException error) {
+ connection.reset();
+ statement = connection.getInstance().prepareStatement(parsedQuery);
+ }
return statement.executeUpdate();
}