当前位置: 首页 > 知识库问答 >
问题:

在Android中使用JDBC优化mysql DB执行

岳迪
2023-03-14

我有一些代码在android,这是运行一个查询的数据库,我已经托管在网上。我在这个activity中使用了AsyncTask来执行数据库操作,同样我还有其他的活动也有类似的代码和连接过程。我想知道这是否是在android中使用JDBC连接连接到mysql db的最佳方式,或者是否可以改进

与MainActivity类中一样,登录代码大约需要3秒。

public class MainActivity extends AppCompatActivity {

private ProgressDialog mProgress;
final int REQUEST_PERMISSION_CODE = 1000;

private static final String url = "jdbc:mysql://192.168.0.103/pos";
private static final String user = "root";
private static final String pass = "";
private EditText mPassword, mUsername;
private Button loginBtn;
private ProgressBar mLoginProgress;
private TextView mLoginFeedbackText;
String password, username;
ProgressDialog progressDialog;
Boolean CheckEditText;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    if (!checkPermissionFromDevice())
        requestPermission();

    mPassword = findViewById(R.id.password);
    mUsername = findViewById(R.id.username);
    loginBtn = findViewById(R.id.generate_btn);
    mLoginProgress = findViewById(R.id.login_progress_bar);
    mLoginFeedbackText = findViewById(R.id.login_form_feedback);
    mProgress = new ProgressDialog(this);
    
    loginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            CheckEditTextIsEmptyOrNot();
            if (CheckEditText) {
                UserLoginFunction(username, password);
            } else {
                Toast.makeText(MainActivity.this, "Please fill all form fields.", Toast.LENGTH_LONG).show();
            }
        }
    });
}

public void CheckEditTextIsEmptyOrNot() {
    username = mUsername.getText().toString();
    password = mPassword.getText().toString();
    if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
        CheckEditText = false;
    } else {
        CheckEditText = true;
    }
}

private void requestPermission() {
    ActivityCompat.requestPermissions(this, new String[]{
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.RECORD_AUDIO
    }, REQUEST_PERMISSION_CODE);
}

private boolean checkPermissionFromDevice() {
    int write_external_storage_result = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int record_audio_result = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);
    return write_external_storage_result == PackageManager.PERMISSION_GRANTED &&
            record_audio_result == PackageManager.PERMISSION_GRANTED;
}
public void UserLoginFunction(final String username, final String password) {
    class UserLoginClass extends AsyncTask<String, Void, String> {
        @Override
        protected void onPreExecute() {
            System.out.println("In onPreExecute");
            super.onPreExecute();

            progressDialog = ProgressDialog.show(MainActivity.this, "Loading Data", null, true, true);
        }

        @Override
        protected void onPostExecute(String httpResponseMsg) {
            System.out.println("In onPostExecute");
            super.onPostExecute(httpResponseMsg);

            progressDialog.dismiss();

            if (httpResponseMsg.equalsIgnoreCase("It matches")) {

                finish();

                Intent intent = new Intent(MainActivity.this, StartActivity.class);
                System.out.println("USERNAME" + username);
                intent.putExtra("USERNAME", username);
                startActivity(intent);

            } else {
                mLoginFeedbackText.setText("Verification Failed, please try again.");
                mLoginFeedbackText.setVisibility(View.VISIBLE);
                mLoginProgress.setVisibility(View.INVISIBLE);
                loginBtn.setEnabled(true);
                Toast.makeText(MainActivity.this, httpResponseMsg, Toast.LENGTH_LONG).show();
            }

        }

        @Override
        protected String doInBackground(String... params) {
            System.out.println("In doInBackground");
            try {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);

                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection(url, user, pass);

                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery("SELECT * FROM `users` WHERE username='BobMartin'");


                while (rs.next()) {
                    String queryPassword = rs.getString("password");
                    String hash_php = queryPassword.replaceFirst("2y", "2a");
                    if (BCrypt.checkpw(password, hash_php)) {
                        con.close();
                        System.out.println("It matches");
                        return "It matches";
                    } else {
                        System.out.println("It does not match");
                        return "It does not match";
                    }
                }
            } catch (ClassNotFoundException | SQLException e) {
                e.printStackTrace();
                System.out.println("result in catch");
            }
            return "It does not match";
        }
    }
    UserLoginClass userLoginClass = new UserLoginClass();
    userLoginClass.execute(username, password);
}


}

类似地,对于其他activity,我也再次创建连接和关闭他们以类似的方式,如图所示。

public class StartActivity extends AppCompatActivity {
Button startButton;
String userName;
private static final String url = "jdbc:mysql://192.168.0.103/pos";
private static final String user = "root";
private static final String pass = "";

ArrayList<String> dbQuestions = new ArrayList<String>();
ArrayList<String> dbAnswers = new ArrayList<String>();

ProgressDialog progressDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    userName = getIntent().getStringExtra("USERNAME");
    new StartDb().execute();

    startButton = findViewById(R.id.startButton);
    startButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            System.out.println("USERNAMEstart" + userName);
            Intent intent = new Intent(StartActivity.this, BillActivity.class);
            Bundle args = new Bundle();
            args.putSerializable("ANSWERS", (Serializable) dbAnswers);
            args.putSerializable("QUESTIONS", (Serializable) dbQuestions);
            intent.putExtra("USERNAME", userName);
            intent.putExtra("BUNDLE", args);
            startActivity(intent);
        }
    });
}

@Override
public void onBackPressed() {
    // super.onBackPressed();
    Toast.makeText(StartActivity.this, "There is no back action", Toast.LENGTH_LONG).show();
    return;
}

class StartDb extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        System.out.println("In onPreExecute");
        super.onPreExecute();

        progressDialog = ProgressDialog.show(StartActivity.this, "Loading Data", null, true, true);
    }

    @Override
    protected void onPostExecute(String httpResponseMsg) {
        System.out.println("In onPostExecute");
        super.onPostExecute(httpResponseMsg);
        progressDialog.dismiss();
    }

    @Override
    protected String doInBackground(String... params) {
        System.out.println("In doInBackground");
        try {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);

            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(url, user, pass);

            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM `company_details`");

            while (rs.next()) {

                String que = rs.getString("questions");
                JSONObject obj1 = new JSONObject(que);
                for (Iterator<String> it = obj1.keys(); it.hasNext(); ) {
                    String key = it.next();
                    dbQuestions.add(obj1.getString(key));
                }

                String ans = rs.getString("answers");
                JSONObject obj2 = new JSONObject(ans);
                for (Iterator<String> it = obj2.keys(); it.hasNext(); ) {
                    String key = it.next();
                    dbAnswers.add(obj2.getString(key));
                }

                con.close();
            }
        } catch (ClassNotFoundException | SQLException | JSONException e) {
            e.printStackTrace();
            System.out.println("resilt in catch");
        }
        return "It does not match";
    }
}

}

请建议我如何才能增加执行时间。

共有1个答案

蔡鸿骞
2023-03-14

MySQL协议在长距离上的性能根本不是很好。这只是事实。

如果您需要在很远的距离上访问MySQL,您应该在数据库前面放一个REST/API,在物理上尽可能靠近MySQL运行,然后让您的应用程序查询它,例如在容器中运行多个API网关以进行故障转移&;负载平衡。

[MySQL]-[REST/API网关]-----------{Internet}-----------[客户端]

我从来没有用过它,但是看起来这类东西可以随心所欲-https://www.progress.com/odata/mysql

或者这个“Auto-generate a REST API from an existing MySQL DB”-https://www.indiehackers.com/product/noco/auto-generate-a-rest-api-from-an-existing-mysql-db--lt2cgdhrnrzvlzlmpai

您使用什么REST/API取决于您觉得使用什么后端语言最舒服。

老实说,您真正应该做的是在数据库前面放置一个特定于应用程序的REST/API,这样,如果应用程序中存储的数据库凭据被黑客入侵,人们就不能直接破坏数据库了。

即,您应该有一个REST/API,对客户机应用程序可以做的事情施加特定于应用程序的安全限制。

 类似资料:
  • 问题内容: 我在从Python内部执行某些SQL时遇到了问题,尽管类似的SQL在命令行中也能正常工作。 该表如下所示: 我可以从mysql命令行执行以下SQL查询,而不会出现问题: 但是,当我尝试在Python中执行相同操作时,没有任何行,而我希望有2行: 所以,问题是:应该如何Python代码进行修改,以选择那些S其中是? 顺便说一句,我注意到,如果我切换的角色和,我可以得到代码选择那些S其中是

  • 问题内容: 如何使用MySQLdb python驱动程序执行* .sql文件中存储的sql脚本。我在尝试 但这不起作用,因为 cursor.execute 一次只能运行一个sql命令。我的sql脚本改为包含多个sql语句。我也在尝试 但也没有成功。 问题答案: 假设文件中每行有一条SQL语句。否则,您将需要编写一些规则以将行连接在一起。

  • 问题内容: 目前,我在MySQL服务器中有数据,并且正在通过JDBC将数据调用到JTable上。但是,共有1369行,并且似乎有太多数据无法加载。加载通常需要5分钟。无论如何,有没有优化流程?这是我的代码(我事先为一个混乱的代码道歉): 问题答案: 恕我直言,坏习惯的根源是您不必要地查询数据库的多重时间来获取所需的数据(列,行,行号,列号等): 要获取列号: 要获取行号: 要获取行(这是最糟糕的原

  • 本文向大家介绍Android中使用ViewStub实现布局优化,包括了Android中使用ViewStub实现布局优化的使用技巧和注意事项,需要的朋友参考一下 在Android开发中,View是我们必须要接触的用来展示的技术.通常情况下随着View视图的越来越复杂,整体布局的性能也会随之下降.这里介绍一个在某些场景下提升布局性能的View,它就是ViewStub. ViewStub是什么 View

  • 我需要使用JDBC在Oracle数据库中进行大量插入,即两位数百万。为此,我使用了类似于以下类的东西,灵感来自使用JDBC进行批处理插入的高效方法: 虽然这种插入方式很好,但速度非常慢。JDBC batch insert performance描述了MySQL基本上可以解决这个问题,因为在Oracle上似乎不存在,但在这里没有太大帮助。 为了提高性能,我还尝试将语句切换为一个大的

  • 本文向大家介绍Android中SparseArray性能优化的使用方法,包括了Android中SparseArray性能优化的使用方法的使用技巧和注意事项,需要的朋友参考一下 之前一篇文章研究完横向二级菜单,发现其中使用了SparseArray去替换HashMap的使用.于是乎自己查了一些相关资料,自己同时对性能进行了一些测试。首先先说一下SparseArray的原理.   SparseArray

  • 我有一个连接到Oracle数据库的spring boot REST应用程序。我们正在使用JDBCTemplate来使用JDBC。Oracle数据库属性通过以下3个应用程序获得。属性设置: 此应用程序正在使用Hikaricp。从HikariCP网站上,我了解到这个池不缓存PreparedStatement,因为JDBC驱动程序是最好的。 现在,我将在什么地方和什么地方具体说明以确保这些: > Ora

  • 我正在使用Spring Webflux和Spring数据jpa,使用PostgreSql作为后端数据库。我不想在进行诸如查找和保存之类的db调用时阻塞主线程。为了实现同样的目标,我在Controller类中有一个主调度器,在服务类中有一个jdbcScheduler。 我定义它们的方式是: 现在,当在我的服务层中进行获取/保存调用时,我这样做: 在控制器中,我执行以下操作: 这是正确的吗?和/或有更