我的sqlConnexion与android存在性能问题。问题是,我打开了我在服务器上发出的每个请求的连接。当用户首次登录时,我宁愿打开它一次。
这里有一些代码:
public void onClick(View v) {
// Perform action on click
new Thread(new Runnable() {
public void run() {
Statement statement;
try {
*//This would be better to instantiate connexion at first...*
connexion = DriverManager.getConnection(url, "login",
"pass");//Not true login of course...
statement = connexion.createStatement();
ResultSet resultat = statement
.executeQuery("SELECT name FROM users;");
while (resultat.next()) {
resultId = resultat.getString("name");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
如果我将DriverManager
放在方法中,我会从服务器收到错误。
在另一节课中,我得到NullPointerException
。
我知道使用json解析器可能是一个更好的方法,但我开始学习,而且Java / Android现在也不仅仅给了我headeache ...
答案 0 :(得分:0)
将连接代码移动到Singleton
,或者只是将连接存储在单独的类中的静态属性中。有关详细信息,请参阅Store application global data
答案 1 :(得分:0)
执行以下操作: 声明connexion时将其赋值为null, 并在try catch中检查connexion是否为null。 如果你得到null,则获得新的连接,否则不是
connexion = null;
//In try block
if( connexion == null)
connexion = DriverManager.getConnection(url, "login", "pass");
答案 2 :(得分:0)
不要试图重用连接!对于与数据库的每次逻辑交互,获取连接,语句或其他内容,并确保在函数结束之前将它们全部关闭。
但是,要提高性能,请使用Commons BasicDataSource等连接“池”。使用它对你来说是不可见的。您可以正常使用连接和语句,但BasicDataSource将汇集连接(和PreparedStatements)以提高性能。
答案 3 :(得分:0)
谢谢大家的帮助!
我设法解决了这个问题。我做了什么,如果这可以帮助我在这里发布如何:
首先,为我制作一个其他的Classe,我在其中制作DataSource的驱动程序()
public class Driver implements DataSource {
public static Connection connection = null;
public static final String url = "jdbc:mysql://url/dataBaseName";
protected String user = "userName";
protected String passwd = "password";
//Andoid related, haven't tested the log so, i don't know if this work.
private String state = Environment.getExternalStorageState();
public Driver(){
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public PrintWriter getLogWriter() throws SQLException {
PrintWriter logWriter = null;
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
try {
logWriter = new PrintWriter(state + "/com.me.appName/Logfile.log");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return logWriter;
}
@Override
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return 0;
}
@Override
public void setLogWriter(PrintWriter arg0) throws SQLException {
// TODO Auto-generated method stub
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
try {
DriverManager.setLogWriter(new PrintWriter(
state + "/com.me.appName/Logfile.log"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public boolean isWrapperFor(Class<?> arg0) throws SQLException {
// TODO Auto-generated method stub
return false;
}
@Override
public <T> T unwrap(Class<T> arg0) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Connection getConnection() throws SQLException {
if (connection != null) {
System.out.println("Cant create Connection");
} else {
connection = DriverManager.getConnection(
url, user, passwd);
}
return connection;
}
@Override
public Connection getConnection(String userName, String password)
throws SQLException {
// TODO Auto-generated method stub
if (connection != null) {
System.out.println("Cant craete a Connection");
} else {
connection = DriverManager.getConnection(
url, userName,
password);
}
return connection;
}
}
最后在我的主要Classe:
在onCreate()中我实例化驱动程序然后我可以毫不拖延地做出所有需要的请求:)
public void onClick(View v) {
// Perform action on click
new Thread(new Runnable() {
public void run() {
try {
Statement statement;
//The .getConnection is where i handle the DriverManager.
connexion = driver.getConnection();
statement = connexion.createStatement();
ResultSet resultat = statement
.executeQuery("SELECT name FROM users;");
while (resultat.next()) {
resultId = resultat.getString("name");
}
driver.setLoginTimeout(5);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}).start();
这真的很有用。
再次感谢大家,因为我无法对你的答案进行投票,希望有一天能帮助你!