From 7ffae028567080b04e75c1f5ec8801da5c8106d0 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 30 Nov 2011 09:17:15 +0000 Subject: --- src/org/traccar/Server.java | 29 ++++------- src/org/traccar/helper/AdvancedConnection.java | 57 ++++++++++++++++++++++ .../traccar/helper/NamedParameterStatement.java | 55 ++++++++++++++++++--- 3 files changed, 113 insertions(+), 28 deletions(-) create mode 100644 src/org/traccar/helper/AdvancedConnection.java 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(); } -- cgit v1.2.3