찾다
데이터 베이스MySQL 튜토리얼LINQ-to-SQL那点事~LINQ-to-SQL中的数据缓存与应对

回到目录 这个文章写的有点滞后了,呵呵,因为总想把之前不确定的东西确定了之后,再写这篇,之前的LINQ-to-SQL那点事,请点这里。 LINQ-to-SQL中的数据缓存与应对 Linq-to-SQL它是微软自己推出的一个轻量级的ORM框架,它很好地完成了与SQLSERVER数据库的映

回到目录

这个文章写的有点滞后了,呵呵,因为总想把之前不确定的东西确定了之后,再写这篇,之前的LINQ-to-SQL那点事,请点这里。

LINQ-to-SQL中的数据缓存与应对

Linq-to-SQL它是微软自己推出的一个轻量级的ORM框架,它很好地完成了与SQLSERVER数据库的映射(它目前只支持SQLSERVER,也不会有以后的,因为微软不对它进行更新了),在使用它时,微软提出了“数据上下文”的概念,这个上下文(context)类似于HttpContext,RequestContext,是指对某种事物的完整的抽象,把对这种事物的操作都集成在上下文中。

Linq-to-SQL的上下文被称为DataContext,它进一步的封装了SQL语句,亮点在于它的查询上,支持延时查询,再配合linq的语法,使得开发人员在写代码时很优雅,代码表现力更强。

DataContext在性能方面提出了缓存的概念,它可以装查询出来的数据缓存到上下文中(这有时会产生并发问题),对于Insert,Update,Delete这类执行类操作也提供了缓存语句,每当SubmitChange方法被触发时,这时缓存的语句被一次性的提交到SQLSERVER,之后将当前上下文的缓存语句清空。

一个线程单例的数据上下文的提出:

当你希望把延时的数据返回到表示层时,DataContext如果被dispose之后,这种操作是不被允许的,这是正确的,因为你的数据上下文可能在表示层方法执行前已经被dispose了,一般这种代码会被这样书写:

    <span style="color: #0000ff;">public</span> IQueryable<order_info> GetOrder_Info(Expression<func style="color: #0000ff;">bool>><span style="color: #000000;"> predicate)
        {
            </span><span style="color: #0000ff;">using</span> (<span style="color: #0000ff;">var</span> datacontext = <span style="color: #0000ff;">new</span><span style="color: #000000;"> LinqDataContext())
            {
                </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> datacontext.Where(predicate);
            }
        }</span></func></order_info>

这段代码在执行上当然是有问题的,使用了using关键字后,在方法return这数据上下文DataContext将会被dispose,这是正常的,而由于linq语句返回的是IQueryable延时结果集,它将不会立即执行,只有真正返回数据时才会通过DataContext与SQLSERVER进行交互,而在上层方法中,由于DataContext这时已经被dispose了,所以,语句最终会报异常。

面对这种问题,我们知道了它的原因,所以接下来就寻找一种解决方法,即不叫DataContext立即dispose的方法,你可能会很容易的想到“把using去掉不就可以了”,事实上,如果你对linq to sql了解的话,这种做法是不可取的,因为这样,你在业务逻辑层无法实现“复杂查询,linq join”(一般地,我们为每个DAL层的表对象写几个方法,可能是根据条件去查询数据的方法),为什么呢?因为,对于一个linq查询语句来说,你的数据上下文必须是同一个才行,如果用户业务使用一个上下文,而订单业务使用另一个上下文,那么,这两个业务进行组成查询时,就会出现不同数据上下文的问题。

代码可能是这样:

   <span style="color: #0000ff;">var</span> linq =<span style="color: #0000ff;">from</span> user <span style="color: #0000ff;">in</span><span style="color: #000000;"> userBLL().GetModel()
             join order </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> orderBLL().GetModel() on user.UserID equals order.UserID
              </span><span style="color: #0000ff;">select</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> user_Ext<br>                {
                  ...
                }</span>

为数据上下文添加一个工厂,用来生成由UI线程产生的数据上下文,再把这些上下文放在一个由UI线程作为键的字典里,当UI线程中的数据上下文在进行SubmitChange出现异常进,我们再将当然上下文dispose,并从数据上下文字典中移除它。

数据上下文工厂及数据上下文基类代码如下:

    <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
    <span style="color: #808080;">///</span><span style="color: #008000;"> 数据库建立工厂
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Created By : 张占岭
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Created Date:2011-10-14
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify By:
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify Date:
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify Reason:
    </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
    <span style="color: #0000ff;">internal</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> DbFactory
    {
        </span><span style="color: #0000ff;">#region</span> Fields
        <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">readonly</span> <span style="color: #0000ff;">string</span> strConn = System.Configuration.ConfigurationManager.ConnectionStrings[<span style="color: #800000;">"</span><span style="color: #800000;">test</span><span style="color: #800000;">"</span><span style="color: #000000;">].ToString();
        </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> System.Timers.Timer sysTimer;
        </span><span style="color: #0000ff;">volatile</span> <span style="color: #0000ff;">static</span> Dictionary<thread datacontext><span style="color: #000000;"> divDataContext;
        </span><span style="color: #0000ff;">#endregion</span>

        <span style="color: #0000ff;">#region</span> Constructors
        <span style="color: #0000ff;">static</span><span style="color: #000000;"> DbFactory()
        {
            divDataContext </span>= <span style="color: #0000ff;">new</span> Dictionary<thread datacontext><span style="color: #000000;">();
            sysTimer </span>= <span style="color: #0000ff;">new</span> System.Timers.Timer(<span style="color: #800080;">10000</span><span style="color: #000000;">);
            sysTimer.AutoReset </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
            sysTimer.Enabled </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
            sysTimer.Elapsed </span>+= <span style="color: #0000ff;">new</span><span style="color: #000000;"> System.Timers.ElapsedEventHandler(sysTimer_Elapsed);
            sysTimer.Start();
        }
        </span><span style="color: #0000ff;">#endregion</span>

        <span style="color: #0000ff;">#region</span> Private Methods
        <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
        <span style="color: #808080;">///</span><span style="color: #008000;"> 清理DbContext上下文
        </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="sender"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="e"></span>
        <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> sysTimer_Elapsed(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, System.Timers.ElapsedEventArgs e)
        {
            List</span><thread> list =<span style="color: #000000;"> divDataContext.Keys
                                              .Where(item </span>=> item.ThreadState ==<span style="color: #000000;"> ThreadState.Stopped)
                                              .ToList();
            </span><span style="color: #0000ff;">if</span> (list != <span style="color: #0000ff;">null</span> && list.Count > <span style="color: #800080;">0</span><span style="color: #000000;">)
            {
                </span><span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">var</span> thread <span style="color: #0000ff;">in</span><span style="color: #000000;"> list)
                {
                    </span><span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">var</span> context <span style="color: #0000ff;">in</span><span style="color: #000000;"> divDataContext[thread])
                    {
                        </span><span style="color: #0000ff;">if</span> (context != <span style="color: #0000ff;">null</span><span style="color: #000000;">)
                            context.Dispose();
                    }
                }
            }
        }
        </span><span style="color: #0000ff;">#endregion</span>

        <span style="color: #0000ff;">#region</span> Public Methods
        <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
        <span style="color: #808080;">///</span><span style="color: #008000;"> 通过工厂的制造模式获取相应的LINQ数据库连接对象
        </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="dbName"></span><span style="color: #008000;">数据库名称(需要与真实数据库名称保持一致)</span><span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span><span style="color: #008000;">LINQ数据库连接对象</span><span style="color: #808080;"></span>
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> DataContext Intance(<span style="color: #0000ff;">string</span><span style="color: #000000;"> dbName)
        {
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Intance(dbName, Thread.CurrentThread);
        }

        </span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
        <span style="color: #808080;">///</span><span style="color: #008000;"> 通过工厂的制造模式获取相应的LINQ数据库连接对象
        </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="dbName"></span><span style="color: #008000;">数据库名称(需要与真实数据库名称保持一致)</span><span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="thread"></span><span style="color: #008000;">当前线程引用的对象</span><span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span><span style="color: #008000;">LINQ数据库连接对象</span><span style="color: #808080;"></span>
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> DataContext Intance(<span style="color: #0000ff;">string</span><span style="color: #000000;"> dbName, Thread thread)
        {

            </span><span style="color: #0000ff;">if</span> (!<span style="color: #000000;">divDataContext.Keys.Contains(thread))
            {
                divDataContext.Add(thread, </span><span style="color: #0000ff;">new</span> DataContext[<span style="color: #800080;">3</span><span style="color: #000000;">]);
            }

            </span><span style="color: #0000ff;">if</span> (dbName.Equals(<span style="color: #800000;">"</span><span style="color: #800000;">test</span><span style="color: #800000;">"</span><span style="color: #000000;">))
            {
                </span><span style="color: #0000ff;">if</span> (divDataContext[thread][<span style="color: #800080;">0</span>] == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
                {
                    divDataContext[thread][</span><span style="color: #800080;">0</span>] = <span style="color: #0000ff;">new</span><span style="color: #000000;"> DAL.dbDataContext(strConn);
                }
                </span><span style="color: #0000ff;">return</span> divDataContext[thread][<span style="color: #800080;">0</span><span style="color: #000000;">];
            }

</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span><span style="color: #000000;">;

        }

        </span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
        <span style="color: #808080;">///</span><span style="color: #008000;"> 手动清除数据上下文,根据线程
        </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
        <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="thread"></span>
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> ClearContextByThread(Thread thread, DataContext db)
        {
            divDataContext.Remove(thread);</span><span style="color: #008000;">//</span><span style="color: #008000;">从线程字典中移除</span>
            db.Dispose();<span style="color: #008000;">//</span><span style="color: #008000;">释放数据资源</span>
<span style="color: #000000;">        }
        </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">

    }</span></thread></thread></thread>

 

下面是DataContext基类,已经对SubmitChanges(SaveChanges)方法进行了优化,手动dispose上下文。

<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
    <span style="color: #808080;">///</span><span style="color: #008000;"> Repository基类
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> 所有linqTosql上下文对象都继承它
    </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> ContextBase
    {
        </span><span style="color: #0000ff;">protected</span> DataContext _db { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
        </span><span style="color: #0000ff;">protected</span> IUnitOfWork UnitOfWork { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> ContextBase(DataContext db)
        {
            _db </span>=<span style="color: #000000;"> db;
            UnitOfWork </span>=<span style="color: #000000;"> (IUnitOfWork)db;
        }
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> SaveChanges()
        {
            ChangeSet cSet </span>=<span style="color: #000000;"> _db.GetChangeSet();
            </span><span style="color: #0000ff;">if</span> ((cSet.Inserts.Count > <span style="color: #800080;">0</span>
                || cSet.Updates.Count > <span style="color: #800080;">0</span>
                || cSet.Deletes.Count > <span style="color: #800080;">0</span><span style="color: #000000;">)
                </span>&& !<span style="color: #000000;">UnitOfWork.IsNotSubmit)
            {
                </span><span style="color: #0000ff;">try</span><span style="color: #000000;">
                {
                    UnitOfWork.SaveChanges();
                }
                </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (System.Data.Linq.ChangeConflictException)
                {
                    </span><span style="color: #0000ff;">foreach</span> (System.Data.Linq.ObjectChangeConflict occ <span style="color: #0000ff;">in</span><span style="color: #000000;"> _db.ChangeConflicts)
                    {
                        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用当前数据库中的值,覆盖Linq缓存中实体对象的值  </span>
<span style="color: #000000;">                        occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);
                        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用Linq缓存中实体对象的值,覆盖当前数据库中的值  </span>
<span style="color: #000000;">                        occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);
                        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 只更新实体对象中改变的字段的值,其他的保留不变  </span>
<span style="color: #000000;">                        occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
                    }
                    UnitOfWork.SaveChanges();
                }
              </span><span style="color: #0000ff;">catch</span> (Exception)<span style="color: #008000;">//</span><span style="color: #008000;">如果出现异常,就从数据字典中清除这个键值对</span>
<span style="color: #000000;">                {
                    DbFactory.ClearContextByThread(System.Threading.Thread.CurrentThread, _db);
              }
            }
        }
    }</span>

下面是一个领域的repository基类,代码如下:

    <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
    <span style="color: #808080;">///</span><span style="color: #008000;"> Test数据库基类
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Created By : 张占岭
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Created Date:2011-10-14
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify By:
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify Date:
    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Modify Reason:
    </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> TestBase : ContextBase
    {
        </span><span style="color: #0000ff;">#region</span> Constructors
        <span style="color: #0000ff;">public</span><span style="color: #000000;"> EEE114Base()
            : </span><span style="color: #0000ff;">this</span>(<span style="color: #0000ff;">null</span><span style="color: #000000;">)
        { }

        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> EEE114Base(IUnitOfWork db)
            : </span><span style="color: #0000ff;">base</span>((DataContext)db ?? DbFactory.Intance(<span style="color: #800000;">"</span><span style="color: #800000;">test</span><span style="color: #800000;">"</span><span style="color: #000000;">, Thread.CurrentThread))
        { }
        </span><span style="color: #0000ff;">#endregion</span>

        <span style="color: #0000ff;">#region</span> Protected Properies
        <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
        <span style="color: #808080;">///</span><span style="color: #008000;"> 可以使用的数据库连接对象
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> [xxb]
        </span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>
        <span style="color: #0000ff;">protected</span><span style="color: #000000;"> dbDataContext db
        {
            </span><span style="color: #0000ff;">get</span><span style="color: #000000;">
            {
                </span><span style="color: #0000ff;">return</span> (dbDataContext)<span style="color: #0000ff;">base</span><span style="color: #000000;">._db;
            }
        }

        </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">
 }
}</span>

OK,这就是改善之后的linq to sql架构的核心代码,主要体现在生成数据上下文对象上,及如何去避免并发冲突的产生,而对于并发冲突我们会在另一篇文章中做详细的说明。敬请期待!

回到目录

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
MySQL : 초보자가 마스터하는 필수 기술MySQL : 초보자가 마스터하는 필수 기술Apr 18, 2025 am 12:24 AM

MySQL은 초보자가 데이터베이스 기술을 배우는 데 적합합니다. 1. MySQL 서버 및 클라이언트 도구를 설치하십시오. 2. SELECT와 같은 기본 SQL 쿼리를 이해하십시오. 3. 마스터 데이터 작업 : 데이터를 만들고, 삽입, 업데이트 및 삭제합니다. 4. 고급 기술 배우기 : 하위 쿼리 및 창 함수. 5. 디버깅 및 최적화 : 구문 확인, 인덱스 사용, 선택*을 피하고 제한을 사용하십시오.

MySQL : 구조화 된 데이터 및 관계형 데이터베이스MySQL : 구조화 된 데이터 및 관계형 데이터베이스Apr 18, 2025 am 12:22 AM

MySQL은 테이블 구조 및 SQL 쿼리를 통해 구조화 된 데이터를 효율적으로 관리하고 외래 키를 통해 테이블 ​​간 관계를 구현합니다. 1. 테이블을 만들 때 데이터 형식을 정의하고 입력하십시오. 2. 외래 키를 사용하여 테이블 간의 관계를 설정하십시오. 3. 인덱싱 및 쿼리 최적화를 통해 성능을 향상시킵니다. 4. 데이터 보안 및 성능 최적화를 보장하기 위해 데이터베이스를 정기적으로 백업 및 모니터링합니다.

MySQL : 주요 기능 및 기능이 설명되었습니다MySQL : 주요 기능 및 기능이 설명되었습니다Apr 18, 2025 am 12:17 AM

MySQL은 웹 개발에 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 주요 기능에는 다음이 포함됩니다. 1. 다른 시나리오에 적합한 InnoDB 및 MyISAM과 같은 여러 스토리지 엔진을 지원합니다. 2.로드 밸런싱 및 데이터 백업을 용이하게하기 위해 마스터 슬레이브 복제 기능을 제공합니다. 3. 쿼리 최적화 및 색인 사용을 통해 쿼리 효율성을 향상시킵니다.

SQL의 목적 : MySQL 데이터베이스와 상호 작용합니다SQL의 목적 : MySQL 데이터베이스와 상호 작용합니다Apr 18, 2025 am 12:12 AM

SQL은 MySQL 데이터베이스와 상호 작용하여 데이터 첨가, 삭제, 수정, 검사 및 데이터베이스 설계를 실현하는 데 사용됩니다. 1) SQL은 Select, Insert, Update, Delete 문을 통해 데이터 작업을 수행합니다. 2) 데이터베이스 설계 및 관리에 대한 생성, 변경, 삭제 문을 사용하십시오. 3) 복잡한 쿼리 및 데이터 분석은 SQL을 통해 구현되어 비즈니스 의사 결정 효율성을 향상시킵니다.

초보자를위한 MySQL : 데이터베이스 관리를 시작합니다초보자를위한 MySQL : 데이터베이스 관리를 시작합니다Apr 18, 2025 am 12:10 AM

MySQL의 기본 작업에는 데이터베이스, 테이블 작성 및 SQL을 사용하여 데이터에서 CRUD 작업을 수행하는 것이 포함됩니다. 1. 데이터베이스 생성 : createAbasemy_first_db; 2. 테이블 만들기 : CreateTableBooks (idintauto_incrementprimarykey, titlevarchar (100) notnull, authorvarchar (100) notnull, published_yearint); 3. 데이터 삽입 : InsertIntobooks (Title, Author, Published_year) VA

MySQL의 역할 : 웹 응용 프로그램의 데이터베이스MySQL의 역할 : 웹 응용 프로그램의 데이터베이스Apr 17, 2025 am 12:23 AM

웹 응용 프로그램에서 MySQL의 주요 역할은 데이터를 저장하고 관리하는 것입니다. 1. MySQL은 사용자 정보, 제품 카탈로그, 트랜잭션 레코드 및 기타 데이터를 효율적으로 처리합니다. 2. SQL 쿼리를 통해 개발자는 데이터베이스에서 정보를 추출하여 동적 컨텐츠를 생성 할 수 있습니다. 3.mysql은 클라이언트-서버 모델을 기반으로 작동하여 허용 가능한 쿼리 속도를 보장합니다.

MySQL : 첫 번째 데이터베이스 구축MySQL : 첫 번째 데이터베이스 구축Apr 17, 2025 am 12:22 AM

MySQL 데이터베이스를 구축하는 단계에는 다음이 포함됩니다. 1. 데이터베이스 및 테이블 작성, 2. 데이터 삽입 및 3. 쿼리를 수행하십시오. 먼저 CreateAbase 및 CreateTable 문을 사용하여 데이터베이스 및 테이블을 작성한 다음 InsertInto 문을 사용하여 데이터를 삽입 한 다음 최종적으로 SELECT 문을 사용하여 데이터를 쿼리하십시오.

MySQL : 데이터 저장에 대한 초보자 친화적 인 접근 방식MySQL : 데이터 저장에 대한 초보자 친화적 인 접근 방식Apr 17, 2025 am 12:21 AM

MySQL은 사용하기 쉽고 강력하기 때문에 초보자에게 적합합니다. 1.MySQL은 관계형 데이터베이스이며 CRUD 작업에 SQL을 사용합니다. 2. 설치가 간단하고 루트 사용자 비밀번호를 구성해야합니다. 3. 삽입, 업데이트, 삭제 및 선택하여 데이터 작업을 수행하십시오. 4. Orderby, Where and Join은 복잡한 쿼리에 사용될 수 있습니다. 5. 디버깅은 구문을 확인하고 쿼리를 분석하기 위해 설명을 사용해야합니다. 6. 최적화 제안에는 인덱스 사용, 올바른 데이터 유형 선택 및 우수한 프로그래밍 습관이 포함됩니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기