- 浏览: 175990 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (87)
- Android (7)
- J2EE (34)
- JavaScript (6)
- CSS (1)
- Scala (0)
- WEB (5)
- Ruby (1)
- J2EE Netbeans JDK (1)
- Maven (2)
- AndroidMenuTest (0)
- ExtJS (1)
- MyBatis (4)
- iBatis (3)
- Quartz (1)
- JavaABC (3)
- HTML (1)
- JQuery (2)
- mysql (3)
- Linux (2)
- windows (1)
- ant (2)
- jboss (1)
- eclipse (1)
- junit (1)
- nginx (1)
- Google (0)
- git (2)
- python (1)
- kafka (1)
- sqlserver (1)
- jdk8+ (1)
参考 : How to avoid huge transactions with CMP Entity Beans on JBoss
By default, CMP Entity Beans on JBoss are set to require a transaction. Also by default, any time you touch any session or entity bean, your request thread takes out a lock on that entire object, even if you are only reading it and not updating it. Lastly, also by default, JBoss will make sure that for any given entity, there is only one instance of that entity in memory at a time.
All of these defaults have serious implications. For one, it implies that anything other than a toy application will likely become a de-facto, single-threaded application. Imagine, for example, that you have an earthquake tracking application. Your application might have an Entity Bean called Earthquake. After getting under way with the application, you realize there are different kinds of earthquake: tectonic, volcanic, and man-made. These don’t merit having a full-on Earthquake subclass of their own, but maybe you want to model the types as a new Entity called EarthquakeType so that the application can be data-driven and new types can be added later without changing code. The vast majority (~90%) of earthquakes are tectonic, so most of what you ever display to a user will be “tectonic”.
So, you might have a web page that displays the last 40 earthquakes in descending chronological order in a table and also a count of how many different types. This could lead to innocent code like, say:
foreach (Earthquake earthquake : earthquakes){
typeSum[earthquake.getType().getId()]++;
}
The moment you call earthquake.getType() for the first earthquake in the list, you will lock the “tectonic” instance of the EarthquakeType Entity bean. This means that every other thread executing in the same JVM (if configured the default JBoss way) will most likely block (who doesn’t need to know what the earthquake type is, after all?) until this thread is done displaying its page. Even worse, if this thread is holding a lock that some other thread needs, and that other thread is holding a lock that this thread needs, then you have a deadlock. All of this in spite of the fact that actually updating an EarthquakeType is extremely rare because they are read-mostly.
A telltale sign that you are having this problem is seeing stack traces like this one:
org.jboss.util.deadlock.ApplicationDeadlockException: Application deadlock detected, resource=org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock@290df5c3, bean=
…snip…
at org.jboss.util.deadlock.DeadlockDetector.deadlockDetection(DeadlockDetector.java:69)
at org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock.waitForTx(QueuedPessimisticEJBLock.java:292)
at org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock.doSchedule(QueuedPessimisticEJBLock.java:230)
…snip.
At first, it’s tempting to fume at JBoss for having such conservative default settings. I know I did this morning as I was learning more about the details. But the fact is that they really have no choice. The application container has no idea that EarthquakeType is read-mostly. It doesn’t know if you will read it at the beginning of the request and then modify it 300 milliseconds later at the end of the request. So, it is forced to loop absolutely everything you touch into a giant transaction unless you tell it otherwise.
Now, the “telling it otherwise” is where things start to get tricky. Here, I really do think that JBoss hasn’t done us any favors. It’s a multi-step process to making sure you maximize your throughput and minimize deadlocks. If you do some steps but don’t do others, then nothing will change and you won’t know why.
So, here are the steps…
1) Mark all your read-only methods on Entity beans as such. This is where most people start, probably because it’s the kind of advice that pops to the top of Google searches. However, taking this step is a necessary but not sufficient condition for breaking down these huge transactions and their locks. You still have to follow step 2 and step 3.
To mark a method as read-only, you need to add the “<read-only>true</read-only>” element to its “entity” entry in jboss.xml:
<entity>
<ejb-name>Earthquake</ejb-name>
...
<method-attributes>
<method>
<method-name>getType</method-name>
<read-only>true</read-only>
</method>
...
If you are using XDoclet, then you can accomplish the same thing by adding an annotation:
/*
* @jboss.method-attributes read-only="true"
*/
2) Configure the container to use a lock manager that gives a damn about read-only methods.
Even though you’ve now marked your read-only methods as read-only, the default lock manager (QueuedPessimisticEJBLock) doesn’t actually do anything useful with this information. This fact is buried about half of the way down this lengthy page: http://docs.jboss.org/jbossas/jboss4guide/r2/html/ch5.chapter.html.
To take full advantage of your shiny, new read-only methods, you have to change the configuration for your entity beans to instead use the SimpleReadWriteEJBLock lock manager. This is a two step process. First, create a new container configuration that extends the default one in jboss.xml:
<container-configurations>
<container-configuration extends=“Standard CMP 2.x EntityBean”>
<container-name>DeadlockAvoidingConfiguration</container-name>
<locking-policy>org.jboss.ejb.plugins.lock.SimpleReadWriteEJBLock</locking-policy>
</container-configuration>
</container-configurations>
If you are using XDoclet, you can put the same entry in a file called “jboss-container.xml” and XDoclet will merge them together.
Next, you have to explicitly tell every entity bean to use this container configuration instead of the default one. You do this by adding an entry to the entity entries in jboss.xml:
<entity>
<ejb-name>Earthquake</ejb-name>
…
<configuration-name>DeadlockAvoidingConfiguration</configuration-name>
…
Or, again, if you are using XDoclet then add an annotation to the top of your class:
@jboss.container-configuration name = “DeadlockAvoidingConfiguration”
3) Deal with the read-only fallout
This doesn’t all come for free. Specifically, a common (though not OO-friendly) practice when dealing with one-to-many relationships between entity EJBs is to have a getter that returns a Collection and have client code simply add and remove things from that collection. But, once you’ve marked that getter as read only, then if you try to manipulate the returned Collection it will throw an exception. To fix this, you have to create “adder” and “remover” methods for that relationship.
For example, let’s say we wanted to keep track of witness reports of an Earthquake. You might add a WitnessReport class to the system and a relationship called Earthquake.getWitnessReports() that returns a Collection of WitnessReports. When a new witness sends in a report, then you might have code that does this:
anEarthquake.getWitnessReports().add(aNewWitnessReport);
That code works fine if “getWitnessReports()” is left to its default settings, but blows up with an exception saying your CMR collection is read only if you’ve marked “getWitnessReports()” as read only. What you need to do is add a new method to Earthquake, like so:
public void addWitnessReport(WitnessReport record){
Collection existingReports = this.getWitnessReports();
Collection newReports = new ArrayList(existingReports.size() + 1);
newReports.addAll(existingReports);
newReports.add(record);
this.setWitnessReports(newReports);
}
When this method is invoked, the lock manager will take out a lock and remember to write the changes back to the data store. It’s not pretty, but it does get the job done and saves a great deal of performance elsewhere in the application.
So that’s it. Now you have a faster application that is less deadlock prone. Enjoy the time you save by going out and having a beer right now.
p.s. though I haven’t tested this, apparently all of the above doesn’t work in EJB 3.0 on JBoss
2014-05-23 11:06:32,475 ERROR [org.jboss.ejb.plugins.LogInterceptor] TransactionRolledbackException in method: public abstract com.spokesoft.component.sla.SlaDetails com.spokesoft.component.sla.ejb.Sla.getSlaDetails() throws java.rmi.RemoteException, causedBy: org.jboss.util.deadlock.ApplicationDeadlockException: Application deadlock detected, resource=org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock@a74da8, bean=SlaBean, id=[org:AWSUK],[id:102], refs=2, tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=BEMABC0RFMA3/505839, BranchQual=, localId=505839], synched=Thread[http-0.0.0.0-80-29,5,jboss], timeout=5000, queue=[], holder=TransactionImpl:XidImpl[FormatId=257, GlobalId=BEMABC0RFMA3/505826, BranchQual=, localId=505826], waitingResource=org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock@1db76e2, bean=CalendarBean, id=[org:AWSUK],[id:102], refs=2, tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=BEMABC0RFMA3/505826, BranchQual=, localId=505826], synched=null, timeout=5000, queue=[TXLOCK waitingTx=TransactionImpl:XidImpl[FormatId=257, GlobalId=BEMABC0RFMA3/505839, BranchQual=, localId=505839] id=0 thread=Thread[http-0.0.0.0-80-21,5,jboss] queued=true], waitingResourceHolder=TransactionImpl:XidImpl[FormatId=257, GlobalId=BEMABC0RFMA3/505826, BranchQual=, localId=505826] at org.jboss.util.deadlock.DeadlockDetector.deadlockDetection(DeadlockDetector.java:69) at org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock.waitForTx(QueuedPessimisticEJBLock.java:292) at org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock.doSchedule(QueuedPessimisticEJBLock.java:230) at org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock.schedule(QueuedPessimisticEJBLock.java:194) ...
By default, CMP Entity Beans on JBoss are set to require a transaction. Also by default, any time you touch any session or entity bean, your request thread takes out a lock on that entire object, even if you are only reading it and not updating it. Lastly, also by default, JBoss will make sure that for any given entity, there is only one instance of that entity in memory at a time.
All of these defaults have serious implications. For one, it implies that anything other than a toy application will likely become a de-facto, single-threaded application. Imagine, for example, that you have an earthquake tracking application. Your application might have an Entity Bean called Earthquake. After getting under way with the application, you realize there are different kinds of earthquake: tectonic, volcanic, and man-made. These don’t merit having a full-on Earthquake subclass of their own, but maybe you want to model the types as a new Entity called EarthquakeType so that the application can be data-driven and new types can be added later without changing code. The vast majority (~90%) of earthquakes are tectonic, so most of what you ever display to a user will be “tectonic”.
So, you might have a web page that displays the last 40 earthquakes in descending chronological order in a table and also a count of how many different types. This could lead to innocent code like, say:
foreach (Earthquake earthquake : earthquakes){
typeSum[earthquake.getType().getId()]++;
}
The moment you call earthquake.getType() for the first earthquake in the list, you will lock the “tectonic” instance of the EarthquakeType Entity bean. This means that every other thread executing in the same JVM (if configured the default JBoss way) will most likely block (who doesn’t need to know what the earthquake type is, after all?) until this thread is done displaying its page. Even worse, if this thread is holding a lock that some other thread needs, and that other thread is holding a lock that this thread needs, then you have a deadlock. All of this in spite of the fact that actually updating an EarthquakeType is extremely rare because they are read-mostly.
A telltale sign that you are having this problem is seeing stack traces like this one:
org.jboss.util.deadlock.ApplicationDeadlockException: Application deadlock detected, resource=org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock@290df5c3, bean=
…snip…
at org.jboss.util.deadlock.DeadlockDetector.deadlockDetection(DeadlockDetector.java:69)
at org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock.waitForTx(QueuedPessimisticEJBLock.java:292)
at org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock.doSchedule(QueuedPessimisticEJBLock.java:230)
…snip.
At first, it’s tempting to fume at JBoss for having such conservative default settings. I know I did this morning as I was learning more about the details. But the fact is that they really have no choice. The application container has no idea that EarthquakeType is read-mostly. It doesn’t know if you will read it at the beginning of the request and then modify it 300 milliseconds later at the end of the request. So, it is forced to loop absolutely everything you touch into a giant transaction unless you tell it otherwise.
Now, the “telling it otherwise” is where things start to get tricky. Here, I really do think that JBoss hasn’t done us any favors. It’s a multi-step process to making sure you maximize your throughput and minimize deadlocks. If you do some steps but don’t do others, then nothing will change and you won’t know why.
So, here are the steps…
1) Mark all your read-only methods on Entity beans as such. This is where most people start, probably because it’s the kind of advice that pops to the top of Google searches. However, taking this step is a necessary but not sufficient condition for breaking down these huge transactions and their locks. You still have to follow step 2 and step 3.
To mark a method as read-only, you need to add the “<read-only>true</read-only>” element to its “entity” entry in jboss.xml:
<entity>
<ejb-name>Earthquake</ejb-name>
...
<method-attributes>
<method>
<method-name>getType</method-name>
<read-only>true</read-only>
</method>
...
If you are using XDoclet, then you can accomplish the same thing by adding an annotation:
/*
* @jboss.method-attributes read-only="true"
*/
2) Configure the container to use a lock manager that gives a damn about read-only methods.
Even though you’ve now marked your read-only methods as read-only, the default lock manager (QueuedPessimisticEJBLock) doesn’t actually do anything useful with this information. This fact is buried about half of the way down this lengthy page: http://docs.jboss.org/jbossas/jboss4guide/r2/html/ch5.chapter.html.
To take full advantage of your shiny, new read-only methods, you have to change the configuration for your entity beans to instead use the SimpleReadWriteEJBLock lock manager. This is a two step process. First, create a new container configuration that extends the default one in jboss.xml:
<container-configurations>
<container-configuration extends=“Standard CMP 2.x EntityBean”>
<container-name>DeadlockAvoidingConfiguration</container-name>
<locking-policy>org.jboss.ejb.plugins.lock.SimpleReadWriteEJBLock</locking-policy>
</container-configuration>
</container-configurations>
If you are using XDoclet, you can put the same entry in a file called “jboss-container.xml” and XDoclet will merge them together.
Next, you have to explicitly tell every entity bean to use this container configuration instead of the default one. You do this by adding an entry to the entity entries in jboss.xml:
<entity>
<ejb-name>Earthquake</ejb-name>
…
<configuration-name>DeadlockAvoidingConfiguration</configuration-name>
…
Or, again, if you are using XDoclet then add an annotation to the top of your class:
@jboss.container-configuration name = “DeadlockAvoidingConfiguration”
3) Deal with the read-only fallout
This doesn’t all come for free. Specifically, a common (though not OO-friendly) practice when dealing with one-to-many relationships between entity EJBs is to have a getter that returns a Collection and have client code simply add and remove things from that collection. But, once you’ve marked that getter as read only, then if you try to manipulate the returned Collection it will throw an exception. To fix this, you have to create “adder” and “remover” methods for that relationship.
For example, let’s say we wanted to keep track of witness reports of an Earthquake. You might add a WitnessReport class to the system and a relationship called Earthquake.getWitnessReports() that returns a Collection of WitnessReports. When a new witness sends in a report, then you might have code that does this:
anEarthquake.getWitnessReports().add(aNewWitnessReport);
That code works fine if “getWitnessReports()” is left to its default settings, but blows up with an exception saying your CMR collection is read only if you’ve marked “getWitnessReports()” as read only. What you need to do is add a new method to Earthquake, like so:
public void addWitnessReport(WitnessReport record){
Collection existingReports = this.getWitnessReports();
Collection newReports = new ArrayList(existingReports.size() + 1);
newReports.addAll(existingReports);
newReports.add(record);
this.setWitnessReports(newReports);
}
When this method is invoked, the lock manager will take out a lock and remember to write the changes back to the data store. It’s not pretty, but it does get the job done and saves a great deal of performance elsewhere in the application.
So that’s it. Now you have a faster application that is less deadlock prone. Enjoy the time you save by going out and having a beer right now.
p.s. though I haven’t tested this, apparently all of the above doesn’t work in EJB 3.0 on JBoss
发表评论
-
日志过滤小工具
2020-01-06 20:15 4631.从全量日志中截断部 ... -
GC参考手册
2017-11-09 14:12 568英文版原文:GC Tuning: In Practice 垃圾 ... -
IDENTITY_INSERT 设置为 OFF 时无法指定插入自增ID
2017-02-15 16:10 664IDENTITY_INSERT 设置为 OFF 时,无法指定I ... -
运行时Exception:Wrong return type in function
2015-11-17 21:31 1534D:\Soft\jdk1.7.0_79\bin\java ... -
Java中的常量:如何避免反模式
2015-10-20 20:41 454参考http://www.importnew.com/1670 ... -
java Socket通信小栗子
2015-09-14 09:25 619server端: package com.test.soc ... -
MyBatis 自动生成xml文件
2015-03-12 11:22 3813package com.test.mybatis; ... -
Java mail test
2015-02-12 11:03 1332mail局域网Exchange服务器测试代码,仅限发送到dom ... -
Java Concurrency / Multithreading Tutorial
2014-10-28 09:35 708Java Concurrency / Multithreadi ... -
Comparison method violates its general contract!
2014-10-22 17:24 966jdk1.6升级到1.7后Comparator有null的参数 ... -
JDK1.7 不兼容compare方法
2014-10-21 16:20 797java.lang.IllegalArgumentExcept ... -
Unknown Source的出现及解决
2014-06-18 10:03 934http://www.2cto.com/kf/201103/8 ... -
Java Date相关处理
2014-02-26 14:35 6091.获取UTC时间: Calendar c ... -
Error listenerStart
2013-12-11 19:25 733INFO: Deploying web applicati ... -
Error configuring application listener of class org.springframework.web.context.
2013-12-07 18:54 38187如果Eclipse的BuildPath里面不缺jar包并且在 ... -
iReport字体报错“JRFontNotFoundException”
2013-10-11 11:08 12813net.sf.jasperreports.engine.uti ... -
Eclipse里Jboss的配置
2013-07-15 17:41 9651.\WorkSpace\.metadata\.plugins ... -
Ant安装使用入门
2013-07-04 14:03 573下载Ant之后,增加环境变量1.ANT_HOME=xx/xx/ ... -
javaSystem获取系统信息
2013-03-27 16:30 812public static void main(Strin ... -
设计模式学习笔记
2013-03-22 18:01 846简单工厂,策略模式,单一职责,开放封闭,依赖倒转 装饰模式,代 ...
相关推荐
有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上
【资源说明】 基于selenium的携程机票爬虫资料齐全+详细文档+高分项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。
免费下载:Civil War (Stuart Moore)_xVBgd.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
免费下载:Spider-Man (Stefan Petrucha)_2pBuA.zip
jj视频合并程序代码QZQ
zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
【资源说明】 基于卷积神经网络的通信调制方式识别详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
理层、数据链路层、网络层、传输层和应用层的功能、技术和协议。同时,对网络安全、无线网络、网络管理和网络新技术进行了深入剖析。通过案例分析帮助学习者更好地理解实际应用,推荐学习资源助力深入学习。最后总结要点并展望未来网络发展趋势,为计算机网络学习者提供了丰富的知识和实用的指导。
51单片机控制的智能小车.7z
计算结构体变量的内存大小1.cpp
【资源说明】 基于多智能体深度强化学习的车联网通信资源分配优化详细文档+全部资料+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
空中俯视物体检测11-YOLO(v5至v9)、COCO、CreateML、Paligemma数据集合集.rarDOTA V2开发训练-V1 2023-12-28 10:02 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括8388张图像。 以可可格式注释了飞机船舶存储 - 基准桶。 将以下预处理应用于每个图像: 没有应用图像增强技术。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
【资源说明】 基于selenium与requests的暨南大学自动健康打卡程序资料齐全+详细文档+高分项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
免费下载:Hilma af Klint a Biography (Julia Voss)_tFy2T.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
图书管理系统作为示例,这个系统将包括以下功能: 功能要求 用户管理:注册、登录、查看用户信息。 图书管理:添加、删除、修改、查询图书信息。 借书和还书:用户可以借阅图书并记录借书信息。 查询功能:按书名、作者、ISBN查询图书。 日志记录:记录系统中的所有操作。 使用技术 Python:作为主要编程语言。 Flask:一个轻量级的Web框架。 SQLite:作为数据库来存储用户和图书信息。 SQLAlchemy:ORM工具,简化数据库操作。 Flask-Login:用于管理用户会话。 Flask-WTF:处理表单。 Bcrypt:密码哈希处理。 数据库设计 Users Table: id, username, password, email Books Table: id, title, author, isbn, quantity Borrow Table: id, user_id, book_id, borrowed_date, return_date 扩展需求 安全控制: 所有用户数据加密存储。 使用HTTPS来加密传输的数据。 实现角色和权限控制,管理员可以管理图书和用户,普