MySQL için Azure Veritabanı'yla ilgili geçici hataları işleme ve veritabanına verimli bir şekilde bağlanma

AŞAĞıDAKILER IÇIN GEÇERLIDIR: MySQL için Azure Veritabanı - Tek Sunucu

Bu makalede, geçici hataların nasıl işlen ve hatalara verimli bir şekilde nasıl bağlan MySQL için Azure Veritabanı.

Geçici hatalar

Geçici hata olarak da bilinen geçici bir hata, kendi kendine çözülecek bir hatadır. Bu hatalar genellikle bırakılan veritabanı sunucusuna bağlantı olarak kendini gösterir. Ayrıca yeni bir sunucu bağlantıları açılamıyor. Örneğin, donanım veya ağ hatası oluştuğunda geçici hatalar oluşabilir. Bunun bir diğer nedeni de, paaS hizmetinin yeni bir sürümünün çıkarılmış olması olabilir. Bu olayların çoğu sistem tarafından 60 saniyeden kısa sürede otomatik olarak azaltılır. Bulutta uygulama tasarlama ve geliştirme için en iyi yöntem geçici hatalar beklemektir. Bunların herhangi bir bileşende herhangi bir zamanda ve bu durumların üstesinden gelebilir uygun mantığın olmasıyla ilgili olduğunu varsayabilirsiniz.

Geçici hataları işleme

Geçici hatalar yeniden deneme mantığı kullanılarak iş gerekir. Dikkate alınacak durumlar:

  • Bağlantı açmaya çalışsanız bir hata oluşur
  • Sunucu tarafında boş bir bağlantı bırakılır. Bir komut yürütmeyi deneyebilirsiniz
  • Şu anda komut yürüten etkin bir bağlantı bırakılır.

Birinci ve ikinci olay oldukça ileriye doğru ilerler. Bağlantıyı yeniden açmayı deneyin. Başarılı olursanız, geçici hata sistem tarafından azaltıldı. Kendi kaynaklarınızı yeniden MySQL için Azure Veritabanı kullanabilirsiniz. Bağlantıyı yeniden denemeden önce beklemeleri öneririz. İlk yeniden denemeler başarısız olursa geri kapatın. Bu şekilde sistem, hata durumunun üstesinden gelmek için kullanılabilir olan tüm kaynakları kullanabilir. Takip etmek iyi bir desendir:

  • İlk yeniden denemeden önce 5 saniye bekleyin.
  • Aşağıdaki her yeniden deneme için bekleme süresi üstel olarak 60 saniyeye kadar artar.
  • En fazla yeniden deneme sayısını ayarlayın; bu noktada, uygulamanız işlemi başarısız olarak kabul ediyor.

Etkin bir işlemle bağlantı başarısız olduğunda kurtarmayı doğru şekilde işlemek daha zordur. İki durum vardır: İşlem salt okunur durumda ise bağlantıyı yeniden açmak ve işlemi yeniden denemek güvenlidir. Ancak işlem veritabanına da yazıyorsa, geçici hata olmadan önce işlem geri alın mı yoksa başarılı mı olduğunu belirlemeniz gerekir. Bu durumda, yalnızca veritabanı sunucusundan işleme onayını almış olmazsınız.

Bunu yapma yollarından biri, istemcide tüm yeniden denemeler için kullanılan benzersiz bir kimlik oluşturmaktır. Bu benzersiz kimliği, işlem kapsamında sunucuya iletir ve benzersiz kısıtlaması olan bir sütunda depolarsınız. Bu şekilde işlemi güvenli bir şekilde yeniden sınabilirsiniz. Önceki işlem geri alındı ve istemci tarafından oluşturulan benzersiz kimlik henüz sistemde yoksa başarılı olur. Önceki işlem başarıyla tamamlandığından, benzersiz kimlik daha önce depolanmışsa yinelenen anahtar ihlaline işaret eden başarısız olur.

Programınız üçüncü taraf ara MySQL için Azure Veritabanı üzerinden iletişim kurarsa, satıcıya ara yazılımda geçici hatalar için yeniden deneme mantığının olup olmadığını sorun.

Yeniden deneme mantığını test etmek için emin olun. Örneğin, MySQL için Azure Veritabanı sunucunuzda işlem kaynaklarının ölçeğini yukarı veya aşağı doğru ölçeklendirirken kodunuzu yürütmeyi deneyin. Uygulamanız bu işlem sırasında karşılaşılan kısa kapalı kalma süresini hiçbir sorun olmadan işlemeli.

Bağlan verimli bir şekilde MySQL için Azure Veritabanı

Veritabanı bağlantıları sınırlı bir kaynaktır, bu nedenle erişim için bağlantı havuzu kullanımının etkili bir şekilde MySQL için Azure Veritabanı iyileştiricidir. Aşağıdaki bölümde, bağlantı havuzu oluşturma veya kalıcı bağlantıları kullanarak bağlantı havuzlarına daha verimli bir şekilde MySQL için Azure Veritabanı.

Veritabanı bağlantılarını yönetmek, uygulamanın bir bütün olarak performansını önemli ölçüde etkileyebilir. Uygulama performansını iyileştirmek için, hedefin bağlantı kurma sayısını ve anahtar kod yollarında bağlantı kurma süresini azaltmak olması gerekir. Veritabanı bağlantı havuzu veya veritabanına bağlanmak için kalıcı bağlantılar MySQL için Azure Veritabanı. Veritabanı bağlantı havuzu, veritabanı bağlantılarının oluşturulmasını, yönetimini ve ayırmayı ele alır. Bir program veritabanı bağlantısı isteğinda olduğunda, yeni bir bağlantı oluşturmak yerine mevcut boştaki veritabanı bağlantılarının ayırmaya öncelik verir. Program veritabanı bağlantısını kullanmayı bitirdikten sonra bağlantı, kapatılma yerine daha fazla kullanım hazırlığında kurtarıldı.

Daha iyi bir çizim için bu makale örnek olarak JAVA kullanan bir örnek kod parçası sağlar. Daha fazla bilgi için bkz. Apache common DBCP.

Not

Sunucu, kaynakları serbest bırakarak bir süredir boşta durumda olan bağlantıyı kapatmak için bir zaman aşımı mekanizması yapılandırıyor. Bunları kullanırken kalıcı bağlantıların verimli olduğundan emin olmak için doğrulama sistemini ayardan emin olun. Daha fazla bilgi için, kalıcı bağlantıların etkili olduğundan emin olmak içinbkz. İstemci tarafında doğrulama sistemlerini yapılandırma.

Kalıcı bağlantılar kavramı, bağlantı havuzuyla benzerdir. Kısa bağlantıları kalıcı bağlantılarla değiştirmek için kodda yalnızca küçük değişiklikler gerekir, ancak çoğu tipik uygulama senaryosunda performansı artırma açısından önemli bir etkisi vardır.

Kısa bağlantılarla bekleme ve yeniden deneme mekanizmasını kullanarak veritabanlarına erişme

Kaynak sınırlamalarınız varsa veritabanlarına erişmek için veritabanı havuzu veya kalıcı bağlantılar kullanmanızı kesinlikle öneririz. Uygulamanız kısa bağlantılar kullanıyorsa ve eşzamanlı bağlantı sayısı üst sınırına yaklaşacaksanız bağlantı hatalarında sorun yaşamanız durumunda bekleme ve yeniden deneme mekanizmasını denemeniz gerekir. İlk denemeden sonra daha kısa bir bekleme süresiyle uygun bir bekleme süresi ayarlayabilirsiniz. Bundan sonra, olayları birden çok kez beklemeyi denemeyi örneğin.

İstemcilerde doğrulama mekanizmalarını yapılandırarak kalıcı bağlantıların ne kadar etkili olduğunu onaylayın

Sunucu, kaynakları serbest bırakarak bir süredir boşta durumda olan bağlantıyı kapatmak için bir zaman aşımı mekanizması yapılandırıyor. İstemci veritabanına yeniden erişenin, istemci ile sunucu arasında yeni bir bağlantı isteği oluşturmakla eşdeğerdir. Bağlantıları kullanma işlemi sırasında bağlantıların etkili olmasını sağlamak için istemcide bir doğrulama mekanizması yapılandırmanız gerekir. Aşağıdaki örnekte gösterildiği gibi, bu doğrulama mekanizmasını yapılandırmak için Tomcat JDBC bağlantı havuzunu kullanabilirsiniz.

TestOnFunrow parametresini ayarerek, yeni bir istek olduğunda, bağlantı havuzu kullanılabilir boştaki bağlantıların etkinliğini otomatik olarak doğrular. Böyle bir bağlantı etkili olursa doğrudan döndürülür, aksi takdirde bağlantı havuzu bağlantıyı geri çekmektedir. Ardından bağlantı havuzu yeni bir etkin bağlantı oluşturur ve bunu döndürür. Bu işlem, veritabanına verimli bir şekilde erişilmalarını sağlar.

Belirli ayarlar hakkında bilgi için JDBC bağlantı havuzu resmi giriş belgesine bakın. Temel olarak şu üç parametreyi ayarlamalısınız: TestOnFunRow (true olarak ayarlanmış), ValidationQuery (SELECT 1 olarak ayarlanır) ve ValidationQueryTimeout (1 olarak ayarlanır). Belirli bir örnek kod aşağıda gösterilmiştir:

public class SimpleTestOnBorrowExample {
      public static void main(String[] args) throws Exception {
          PoolProperties p = new PoolProperties();
          p.setUrl("jdbc:mysql://localhost:3306/mysql");
          p.setDriverClassName("com.mysql.jdbc.Driver");
          p.setUsername("root");
          p.setPassword("password");
            // The indication of whether objects will be validated by the idle object evictor (if any). 
            // If an object fails to validate, it will be dropped from the pool. 
            // NOTE - for a true value to have any effect, the validationQuery or validatorClassName parameter must be set to a non-null string. 
          p.setTestOnBorrow(true); 

            // The SQL query that will be used to validate connections from this pool before returning them to the caller.
            // If specified, this query does not have to return any data, it just can't throw a SQLException.
          p.setValidationQuery("SELECT 1");

            // The timeout in seconds before a connection validation queries fail. 
            // This works by calling java.sql.Statement.setQueryTimeout(seconds) on the statement that executes the validationQuery. 
            // The pool itself doesn't timeout the query, it is still up to the JDBC driver to enforce query timeouts. 
            // A value less than or equal to zero will disable this feature.
          p.setValidationQueryTimeout(1);
            // set other useful pool properties.
          DataSource datasource = new DataSource();
          datasource.setPoolProperties(p);

          Connection con = null;
          try {
            con = datasource.getConnection();
            // execute your query here
          } finally {
            if (con!=null) try {con.close();}catch (Exception ignore) {}
          }
      }
  }

Sonraki adımlar