当前位置: 首页 > news >正文

网站设计书的结构河南新冠防控

网站设计书的结构,河南新冠防控,网站建设合作流程,上海网页设计公司推荐兴田德润项目背景SQLite介绍SQLite、驱动包下载SQLite使用SQLite和MySQL区别 JDBC搭配SQLiteJDBC原理-创建连接JDBC原理-关闭连接添加和发送SQLJDBC-事务开启和提交 打包.exe文件线程池线程数量问题 项目背景 需求上#xff1a;因为Windows的文件搜索工具搜索速度十分的慢#xff1b… 项目背景SQLite介绍SQLite、驱动包下载SQLite使用SQLite和MySQL区别 JDBC搭配SQLiteJDBC原理-创建连接JDBC原理-关闭连接添加和发送SQLJDBC-事务开启和提交 打包.exe文件线程池线程数量问题 项目背景 需求上因为Windows的文件搜索工具搜索速度十分的慢让大家苦不堪言是否能利用以前学习的知识实现这样子的一个功能呢 项目优点 1搜索速度相近于世面众多文件搜索工具文件大小只需13.4MB 2灵动搜索能支持文件名字拼音进行搜索只需会读即可搜索 3能自主灵活改动能随时根据自己和体验人员的需求进行扩展和升级。 4无广告、无会员、更新的选择权在于用户不自主占用过多内存 SQLite介绍 SQLite、驱动包下载 解压后三个文件我们只取sqlite3.exe即可 SQLite使用 双击打开它会提升连接到一个临时内存数据库使用.open FILENAME重新打开一个永久数据库 我们回到exe文件里shift右键空白处 SQLite和MySQL区别 1它不是客户端服务器结构直接就是一个可执行程序数据库直接文件的方式表示 2操作大同小异但是极个别不一样SQLite是不需要create database/use /drop database/show databases…… 所以我们要删除、显示数据库直接去文件里操作即可 3SQLite轻量一个数据库只有1M左右给别人使用总不可能给别人带个几百MB的MySQL 4sqlite中并不需要选中表直接操作即可因为我们增删查改都会带上表名它会去匹配是哪个表的这个非常符合我们在用户电脑中我的带上的数据库文件创建表然后就能直接使用。要显示知道数据库有哪些表.tables (MySQL里的show table不适合用) 5SQLite插入数据会锁整个表读和读之间无竞争写和读、写和写有竞争。MySQL默认隔离级别是可重复读使用MVCC和锁机制保证的隔离性读和读之间使用共享锁不会锁竞争写使用排它锁会发生竞争。插入数据时使用行级锁。 6SQLite是没有int类型但是它为了兼容其它数据库使用支持我们写int它内部自动进行转换成Integer但是你要想使用自增主键就必须使用Integer JDBC搭配SQLite JDBC原理-创建连接 本质都是通过 Connection 对象才能连接到相应的数据库获取建立连接有两种方式如下 1DriverManager驱动管理早期的jdbc版本你是需要显示加载驱动程序Class.forName(“com.mysql.jdbc.Driver”);4.0以后的版本引入了自动驱动程序加载机制后你直接创建连接即可 Class.forName(com.mysql.jdbc.Driver);//加载驱动程序 DriverManager.getConnection(jdbc:mysql://localhost:3306/testuserrootpasswordrootuseUnicodetruecharacterEncodingUTF-8);//或者String url jdbc:mysql://localhost:3306/mydatabase;String username user;String password password;Connection connection DriverManager.getConnection(url, username, password);2DataSoure可以被视为一个数据源池其中包含了预先创建的Connection对象应用程序可以从中获取连接对象并使用。 ((MysqlDataSource)dataSource).setURL(jdbc:mysql://127.0.0.1:3306/liao?characterEncodingutf8useSSLfalse);((MysqlDataSource)dataSource).setUser(root);((MysqlDataSource)dataSource).setPassword(111111); 两者的区别 1相当于一个是直接创建 Connection 对象就需要设置相关连接信息。而另一个是它内部帮你创建好你通过DataSoure设置相应的连接信息dataSource.setURL(“jdbc:mysql://127.0.0.1:3306/liao?characterEncodingutf8useSSLfalse”);。本质都是在设置Connection对象。 2DataSource是这些Connection对象是它帮你创建好存在那里你只需要通过dataSource设置相应信息然后通过这个dataSource对象获取这个连接即可。相当于一个懒汉模式一个饿汉模式。 3 Connection.close时候虽然都是断开连接释放资源DataSource是把Connection还给这个连接池就是说我现在用完了现在你其它人可以复用这个连接了 JDBC原理-关闭连接 使用完成connection、Resultset、statement对象都需要回收 public static void close(Connection connection, Statement statement, ResultSet resultSet) {if (resultSet ! null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement ! null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection ! null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}添加和发送SQL Statement对象主要是将SQL语句发送到数据库中通常使用的是PreparedStatementPreparedStatement是Statemen子类 如何获取这个对象 //建表特殊一点 connection数据源对象.getConnection(); statementconnection.createStatement(); // String sqlinsert into file_meta values(null,?,?,?,?,?,?,?); preparedStatementconnection.prepareStatement(sql);这个对象有什么好处 好处1 预编译执行之前会先将SQL语句预编译并缓存编译后的执行计划。这样可以提高性能尤其是需要多次执行相同或类似的SQL语句时。 好处2支持使用占位符?来表示参数然后通过调用setXXX()方法为占位符设置具体的参数值。更安全能防SQL注入、数据和SQL分开更好阅读 好处3对于重复执行相同的SQL语句如批量插入由于预编译的存在性能通常比Statement更好。就是它会在MySQL这些数据库服务器缓存的执行计划和结果。 如何真正将sql发送 executeQuery() 方法执行后返回Resultset单个结果集的通常用于select语句。如何遍历这个结果集 while (resultSet.next()) { String nameresultSet.getString(name); }executeUpdate()方法返回值是一个整数指示受影响的行数通常用于update、insert、deletecreate创建表也是用这个提交的语句 JDBC-事务开启和提交 connection.setAutoCommit(false);//开启事务先关闭自动提交的功能String sqlinsert into file_meta values(null,123);preparedStatementconnection.prepareStatement(sql);String sql2insert into file_meta values(null,234);preparedStatementconnection.prepareStatement(sql2);preparedStatement.addBatch();//在这里累计//执行SQLpreparedStatement.executeBatch();//执行完提交事务使用commit提交事务connection.commit();使用你得try catch包裹一下出现异常回滚 connection.rollback(); 最后finally释放资源 打包.exe文件 对于学习来说兴趣是最好的老师能把一个程序给身边的亲朋好友使用这无疑能给我们提供很大的学习动力。想要别人能成功的使用你的程序两种常见手段 第一种web项目部署云服务器上别人能通过网络使用你的程序 第二种把你的程序打包成一个.exe可执行文件给别人使用 需要将依赖的资源一起打包成 JAR 文件可以使用 Maven 插件来实现。常见的 Maven 插件是 maven-assembly-plugin 和 maven-shade-plugin。使用 maven-assembly-plugin如下 1添加配置 buildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-assembly-plugin/artifactIdversion3.3.0/versionconfigurationdescriptorRefsdescriptorRefjar-with-dependencies/descriptorRef/descriptorRefs/configurationexecutionsexecutionidmake-assembly/idphasepackage/phasegoalsgoalsingle/goal/goals/execution/executions/plugin/plugins/build 2 java_everything-1.0-SNAPSHOT.jar只包含了项目自身的编译输出类文件和资源文件。不包含任何依赖项或第三方库也叫瘦JAR。 java_everything-1.0-SNAPSHOT-jar-with-dependencies.jar这个 JAR 包是使用 maven-assembly-plugin 插件创建的它将项目及其所有的依赖项一起打包到一个单独的可执行 JAR 文件中也叫胖JAR。 3打包成.exe文件 需要用exe4j软件操作步骤如下 4测试效果 先让我们本地Java环境失效看看能否执行 jre一定得是在同级下因为打包时配置的是同级目录下否则会出现 线程池线程数量问题 这里涉及一个问题使用线程池添加任务那么线程池的数量应该多少合适 解决上述问题可以采用测试的方法来验证适合的线程池数量并使用计时方法来测量执行时间。但是会有指令重排序问题解决这个问题通过线程之间通信等添加任务完成再通知它结束计时。但是我怎么知道线程池什么时候执行结束呢 方法1 threadPool.getTaskCount() ! threadPool.getCompletedTaskCount();//统计已执行的任务和总任务比较。但是不准确因为任务是一直在变化和添加所以你需要写轮询的方式去判断。也可能我只想判断当前这个任务的三个线程是否执行完中途别人又添加任务了那就不精准了。 方法2 ExecutorService executorExecutors.newFixedThreadPool(10); FutureTaskInteger tasknew FutureTask(()-{//任务return -1; }); executor.submit(task); int resulttask.get();//这个方法就能等待所有任务执行完毕并返回结果 方法3特殊场景可以使用计数器的方式因为给线程池添加任务是内存进行非常快而真正执行更新数据操作硬盘是相对非常慢。所以我们每向线程池添加一个任务就计数器线程池执行完一个任务就计数器–。但是这又有一个问题使用普通计数器会原子性问题。这里能通过使用原子类解决问题。 简化后代码 public class FileManager {Object objectnew Object();private AtomicInteger taskCount new AtomicInteger(0);//计数器public void scanAll(File basePath) {System.out.println([FileManager] scanAll 开始!);long beg System.currentTimeMillis();scanAllByThreadPool(basePath);try {synchronized (object){object.wait();}} catch (InterruptedException e) {e.printStackTrace();}long end System.currentTimeMillis();System.out.println([FileManager] scanAll 结束! 执行时间: (end - beg) ms);}private static ExecutorService executorService Executors.newFixedThreadPool(100);private void scanAllByThreadPool(File basePath) {// 计数器自增taskCount.getAndIncrement(); // taskCount// 扫描操作, 放到线程池里完成.executorService.submit(new Runnable() {Overridepublic void run() {try {scan(basePath);//执行任务} finally {//写在这里防止中间出问题--失败而永远计数器达不到0taskCount.getAndDecrement(); // taskCount--if (taskCount.get() 0) {// 如果计数器为 0 通知主线程结束计时了.synchronized (object){object.notify();}}}}}); }
http://wiki.neutronadmin.com/news/145868/

相关文章:

  • 新华书店网站建设企业做网站属于广告宣传费吗
  • 免费网站如何被百度收录上海高端建站网站
  • 哈尔滨网站建设资海网站备案 信息安全管理协议
  • 文明网站建设情况报告长沙网站开发 58
  • 网站开发所需要的语言百科主题wordpress
  • dede网站地图路径修改广告拍摄
  • 庆阳工程建设网站百度品牌推广
  • 手机网站图片优化太仓市住房和城乡建设局网站
  • vue大型网站开发吗网站代运营价格
  • 营销型网站策划书建设网站的费用如何入账
  • 学生做网站赚钱口碑好的无锡网站建设
  • 网站rar文件湖南招标网官网
  • dw怎么做鲜花网站网站建设需求文章
  • 开一家互联网公司需要多少钱东莞网站优化效果如何
  • 网站运营包括哪些内容有哪些品牌做打底衫的网站
  • 免费网站空间怎么办商丘互联网营销推广
  • wp如何做双语网站外贸建站 智能营销
  • 保山公司做网站什么是网页开发
  • 网站建设国内外研究现状微信公众号登录入口官方
  • 上海市建设小学网站上海微网站建设方案
  • 做什么样的网站seo搜索引擎优化的内容
  • 爱建站吧昆山哪里有做网站的
  • 网站 框架网站飘动广告代码
  • 不要域名做网站搜索引擎营销方法主要有三种
  • 网站说明页内容维护大型门户网站开发
  • 做网站制作外包企业宣传视频
  • 官方网站建设属于什么科目深圳网站建设服务电话
  • 建设网站必备的开发工具二级域名绑定网站
  • 怎么键卖东西的网站公司网站建设推广方案模板
  • 网站运营专员岗位职责视频社区app源码